Nginx+Django+MySQL部署centos发布成功刚隔了1天,就经过了个周日,今天周一打开就502了,真是纳了闷了。
开始搜索原因吧,一步一步来:
第一,按大神们的来,先看看nginx的报错日志文件。
日志目录:/usr/local/nginx/logs/
vim /usr/local/nginx/logs/error.log
2024/05/27 11:59:23 [error] 7323#0: *3 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 123.14.74.183, server: www.***.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:7788", host: "47.**.*.*"
2024/05/27 11:59:23 [error] 7323#0: *3 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 123.14.74.183, server: www.**.com, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://127.0.0.1:7788", host: "47.*.*.*", referrer: "https://47.*.*.*/"
报错内容: recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 123.14.74.183, server: www.***.com, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://127.0.0.1:7788", host: "47.***.***.***", referrer: "https://47.121.**.***.***"
第二,再看看看对应uwsgi的报错日志文件,/www/wwwroot/IP4G/uwsgi.log
vim /www/wwwroot/IP4G/uwsgi.log
报错内容:
invalid request block size: 5530 (max 4096)...skip
invalid request block size: 5432 (max 4096)...skip
invalid request block size: 5552 (max 4096)...skip
搜各种原因,和自己的配置适配,感觉很有可能的就试一下。于是发现了这个解决办法,很简单,可以一试:
第三、nginx配置文件里加上代码:
uwsgi_buffer_size 16k;
uwsgi_busy_buffers_size 24k;
uwsgi_send_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_read_timeout 600;
uwsgi_buffer_size 16k; # 解决502报错 以下5行 24.5.27添加
uwsgi_busy_buffers_size 24k;
#如果你后端的需要超过60秒时间处理请求,那么一定要加上下面三个超时时间的设置,不然60s之后nginx断开链接报超时
uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间,完成握手后向uWSGI传送请求的超时时间。
uwsgi_connect_timeout 600; # 指定连接到后端uWSGI的超时时间。
uwsgi_read_timeout 600;
如图:
第四、uwsgi.ini配置加上代码:
#设置自中断时间,如果后端处理一些请求时间比较长,这个一定要设置大一点
harakiri=3600 #
socket-timeout=3600 #这个是和nginx搭配部署时的设置
http-timeout=3600 #这个是单独部署时的设置
#设置缓冲
post-buffering=65535
buffer-size = 6553600
如图:
第五、关闭setting.py的DEBUG模式,vim /opt/yunwei/yunwei/setting.py
DEBUG = True 改为 DEBUG = False
debug模式为True时,django会自己处理static的静态请求,现在是nginx去处理这些请求,故为False。
第六、,把阿里云ECS里安全组配置中那些端口的出口方向也都打开了。
第七、做完上述步骤,重启uwsgi和nginx,试试最终结果,重启nginx时,又报错:
-bash: nginx: command not found
# 报错内容
-bash: nginx: command not found
原因:在nginx安装好以后出现这种问题,是因为没有配置环境变量,现在加上环境变量。
nginx安装路径为:/usr/local/nginx/sbin ,打开环境文件:
vim /etc/profile
在文件最后增加这两行 :
然后source /etc/profile 刷新,nginx可以成功重启了,各个操作都可以执行了。。
source /etc/profile
第八、新重启了uwsgi和nginx,以为大功告成,打开访问页面时,居然无效,仍然是502页面。烦躁啊!!!(注:所有代码要在虚拟环境下执行)
# 重启代码
cd /www/wwwroot/IP4G/
uwsgi --reload uwsgi.pid # 重启uwsgi
cd /usr/local/nginx/sbin/
nginx -s reload # 重启
想起来最初第一步就应该先试试的基础方法:重启大法。
开始服务器重启:shutdown -r now
shutdown -r now
系统重启开机后,依次执行以下3个命令运行项目:
[root@ip4g IP4G]# cd /www/env/ip4g_env/bin #1先启动虚拟环境
[root@ip4g bin]# source activate
(ip4g_env) [root@ip4g bin]# cd /www/wwwroot/IP4G/
(ip4g_env) [root@ip4g IP4G]# uwsgi --ini uwsgi.ini #2运行uwsgi
[uWSGI] getting INI configuration from uwsgi.ini
(ip4g_env) [root@ip4g IP4G]# cd /usr/local/nginx/sbin/
(ip4g_env) [root@ip4g sbin]# ./nginx #3运行nginx
即依次启动:虚拟环境,uwsgi,nginx 。
ok,开始来访问页面试试,居然可以正常打开访问了,心里这个窝火呀。
哎呀,也不知道 是不是上面几部设置起作用的了,还是系统重启起作用了。就这样子吧!!!
总结:
1、修改nginx配置,加5行代码。
2、修改uwsgi配置,加5行代码。
3、DEBUG = True 改为 DEBUG = False 。
4、端口对外也设置开放。
5、Centos系统重启。
1.2.3.4做完后仍然访问仍然502,5后可以正常访问。。到底1.2.3.4起没起作用,不清楚了,也许最初只做5就可以了呢。浪费时间太长了不能返回一个一个再折腾了,就这样吧。再出问题再解决吧!
再等二天看看,如果还会502,我就把centos系统重装,重新部署一遍项目,把第一遍踩过的坑正好都补上,看还会不会出问题了!!!
花絮:
1、下图是DEBUG = False 应该的结果,beautiful!
2、根据一天的调试,经常用的命令列出来,以复制方便使用:
# virtualenv
cd /www/env/ip4g_env/bin
source activate # 启动虚拟环境
deactivate # 退出虚拟环境
# uwsgi
uwsgi --ini uwsgi.ini # 启动
ps -ef|grep uwsgi # 查看uwsgi启动
uwsgi --stop uwsgi.pid # 停止运行uwsgi,通过包含主进程编号的文件设置停止项目
uwsgi --reload uwsgi.pid # 重启uwsgi
# nginx
.nginx # 启动nginx
nginx -s reload # 重启
nginx -s stop # 关闭
nginx -t # 检测配置文件是否正确
ps -ef | grep nginx # 查询nginx进程