组件介绍
Nginx: 高性能
Web
服务器+负责反向代理;gunicorn: 高性能 WSGI 服务器;
gevent: 将
Python
同步代码转换为异步的协议库;supervisor: 监控服务流程的工具;
版本信息
-bash-4.2# gunicorn --version |
安装 gunicorn 和 gevent
pip install gunicorn |
配置 gunicorn
# gun.py |
启动服务
-bash-4.2# gunicorn -k gevent -c gun.py runserver:app |
此时正常访问http://10.10.15.111:5000/
应该可以看到首页信息提示表示连接服务正常。
注意:此处 ip 和端口均由自己设置,所以访问时应该做相应调整。
如果无法正常访问,则需要验证防火墙是否正常:
- CentOS 7 以下版本
# 查询
-bash-4.2# iptables -nL|grep 5000
# 开放指定端口
-bash-4.2# iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
# 再次查询
-bash-4.2# iptables -nL|grep 5000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000 - CentOS 7
使用firewall-cmd
管理防火墙端口firewall-cmd --query-port=5000/tcp # no
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=5000/tcp # yes
systemctl status firewall
systemctl status firewalld
systemctl restart firewalld安装 nginx 和 supervisor
yum -y install nginx supervisor |
配置 nginx
默认安装的 Nginx 配置文件/etc/nginx/nginx.conf
内有如下配置
include /etc/nginx/conf.d/*.conf; |
即从外部目录/etc/nginx/conf.d/
文件夹下还引入了其他配置文件。
这样,我们不修改默认配置,只在/etc/nginx/conf.d/
目录下增加一个***.conf
,来在外面增加新配置。
在/etc/nginx/conf.d/
增加app.conf
,内容如下:
server { |
启动服务
systemctl start nginx |
- 报错
nginx: [emerg] getpwnam("nginx") failed in /etc/nginx/nginx.conf:5
查看配置该行内容为user nginx;
,添加用户useradd nginx
;
报错
ERR_CONTENT_LENGTH_MISMATCH
查看 nginx 错误日志$ tailf /var/log/nginx/error.log
2019/08/09 03:04:21 [crit] 24616#0: *204 open() "/var/lib/nginx/tmp/proxy/2/03/0000000032" failed (13: Permission denied) while reading upstream, client: 10.10.15.199, server: localhost, request: "GET /static/js/app.1b53c809113e333c2727.js.map HTTP/1.1", upstream: "http://0.0.0.0:5000/static/js/app.1b53c809113e333c2727.js.map", host: "10.10.15.111:82"- 进入首页出现
403 Forbidden
- nginx 启动用户和配置中的工作用户不一致(注意:如果你的
nginx
服务是root
用户运行,则配置中user
项配置为root
); - 配置文件中缺少 index index.html index.htm index.php 行;
- nginx 用户没有相应工作目录的操作权限(
chown -R nginx:nginx WORK_DIR_PATH
); - 防火墙设置。
参考这里:解决 Nginx 出现 403 forbidden (13: Permission denied)报错的四种方法
- nginx 启动用户和配置中的工作用户不一致(注意:如果你的
配置 Supervisor
首先检查是否存在配置文件,一般配置文件的路径是/etc/supervisord.conf
,如果配置文件不存在,我们可以通过命令来生成:echo_supervisord_conf > /etc/supervisord.conf
配置文件的内容很多,项目配置可以参照官网文档
打开配置文件的最后一行;[include]
;files = /etc/supervisord/*.conf # 注意:本人安装版本为ini格式,所以我们自写的配置也应该调整为相应的.ini格式[include] \n files = supervisord.d/*.ini
默认一般是注释掉的,我们可以取消注释,这行配置的作用也很浅显,就是导入设置的路径下的所有conf
文件,这使得我们如果有多个项目可以不用都写在同一个配置文件里,可以一个项目一个配置文件,更适合管理。这里的路径也是可以按照实际需求随意更改。
手动启动 Supervisordsupervisord -c /etc/supervisord.conf
在设置的路径下新建一个配置文件,命令请根据上一步设置的扩展名。[program:project_name]
command=/usr/bin/gunicorn -c gun.py runserver:app # 具体路径根据自己安装或者虚拟环境中的位置进行配置
directory=/project_path/ # 项目路径
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=trueproject_name
按照你的实际需求修改,作为你这个服务的唯一标识,用于启动停止服务时使用。command
修改为测试gunicorn
时使用的命令,建议使用绝对路径。directory
指定了工作路径,通常设置为项目根目录,我们填写的 gun.py 和 app 都是基于这个路径的。
管理Supervisor
的项目是使用supervisorctl
命令,我们可以启动项目试试看
supervisorctl start PROJECT_NAME |
如果没有报错,应该可以和上一步测试gunicorn
一样可以正常访问项目了。
验证-bash-4.2# supervisorctl
app RUNNING pid 24639, uptime 0:20:55
报错记录
- Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord. For help, use /usr/bin/supervisord -h 再次重新启动
# 可以查看supervisor.sock并删除
-bash-4.2# find / -name supervisor.sock
/run/supervisor/supervisor.sock
-bash-4.2# unlink /run/supervisor/supervisor.sock-bash-4.2# supervisord -c /etc/supervisord.conf