项目使用nginx+uwsgi+django部署,访问显示 Nginx 502 Bad Gateway,
查看nginx日志报错:
# cat /var/log/nginx/error.log
failed(111: Connection refused) while connecting to upstream)
报错显示nginx 访问uwsgi被拒绝。
很多博客说是php相关错误,但我并没有用到php,应该是网络和端口的问题,比如ip、防火墙、服务器端口被占用等,接下来检查一下:(用阿里云服务器注意检查有没有将部署端口加入安全组)
# telnet ip
........connect refused
报错显示端口没有开放,考虑是防火墙关系,去打开需要的端口:
# iptables -I INPUT -s 0.0.0.0 -p tcp --dport 8000 -j ACCEPT #放行8000端口
# service iptables save #保存配置
# service iptables restart #重启防火墙
已经通过防火墙打开了端口,重启服务:
# uwsgi --reload uwsgi.pid # 重启
二、今天又出现 Nginx 502 Bad Gateway,
但是试试静态资源,http://0.0.0.0/static/img/1.png可以打开,所以nginx没有问题,应该是uwsgi出错。查看uwsgi错误日志:
!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!
no request plugin is loaded, you will not be able to manage requests.
you may need to install the package for your language of choice, or simply load
it with --plugin.
!!!!!!!!!!! END OF WARNING !!!!!!!!!!
“uWSGI:未加载任何请求插件,您将无法管理请求”,在网上找了半天,很多人说需要“sudo apt-get install uwsgi-plugin-python”,但对我没用,后来发现其实是因为我使用了root 用户来启动uwsgi:
# sudo uwsgi --ini uwsgi.ini # 使用了root用户来启动uwsgi
但其实我的项目在conda环境中,我安装的uwsgi在我的虚拟环境中,并不能通过root用户去运行,正确的命令应该是;
# uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
使用错误命令后,错误日志报错:
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
probably another instance of uWSGI is running on the same address (127.0.0.1:8000).
bind(): Address already in use [core/socket.c line 769]
显示地址已经被占用,这时需要kill掉这些sudo启动的uwsgi进程:
# ps -ef |grep uwsgi
root 8286 1 0 18:08 ? 00:00:00 uwsgi --start uwsgi.ini
root 12876 8286 0 21:30 ? 00:00:00 uwsgi --start uwsgi.ini
# kill -9 8286
最后再重新启动即可:
# uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
有时如果修改了uwsgi.ini就需要重启:
# uwsgi --reload uwsgi.pid
signal_pidfile()/kill(): No such process [core/uwsgi.c line 1695]
对于这个报错,依然先查看进程;
# ps -ef |grep uwsgi
xxx 19451 19443 0 22:05 ? 00:00:00 uwsgi --ini uwsgi.ini
然后打开uwsgi.pid,发现不是19443,更改为19443
最后重启:
# uwsgi --reload uwsgi.pid