上线3分钟CPU飙到100%,老板群里的质问还在刷屏,有人已经用一条指令把崩溃的Flask救活了。
那天运维小哥把日志甩过来,满屏都是500,用户群里骂声一片。
问题卡在Python自带的开发服务器,单进程扛不住两百并发,内存像漏水一样掉。
Gunicorn就是这个时候被捞出来的。
它不是新玩具,GitHub上标星已破9k,只是很多人不知道它有多稳。
一条pip装好,终端里敲
gunicorn -w 4 -b 0.0.0.0:8000 app:app
四个进程同时起跑,CPU曲线立刻从天花板回到地板。
Django也能用,命令换成
gunicorn mysite.wsgi:application
settings.py里把DEBUG关掉,性能还能再提三成。
有人担心进程数怎么给。
经验值是CPU核数×2+1,四核机器直接写9。
真想再保险,装个htop看着跑,负载不超过核数就行。
日志别省。
--access-logfile /var/log/gunicorn/access.log
--error-logfile /var/log/gunicorn/error.log
出问题时翻一眼,比猜代码快十倍。
配置写到单独文件更清爽。建一个gunicorn.conf.py,里面写三行
bind = "0.0.0.0:8000"
workers = 9
loglevel = "info"
启动时只带-c,后面再也不用敲长串。
静态文件交给Nginx。80端口给它,Gunicorn躲在8000。Nginx配置里加两行
location /static/ { root /var/www/app; }
location / { proxy_pass http://127.0.0.1:8000; }
重启后,静态资源直接由Nginx吐,Gunicorn专心跑业务,CPU又降一半。
有人踩坑端口被占,netstat -tlnp看一眼,改个数字立刻复活。依赖缺包就pip install -r requirements.txt,一条命令的事。
线上最怕半夜挂。supervisor再包一层,进程掉了自动拉,第二天老板再也不会凌晨打电话。
看完就能动手。把开发服务器换掉,十分钟搞定,剩下的时间安心写功能。