休闲

python flask nginx 站点搭建

时间:2010-12-5 17:23:32  作者:休闲   来源:时尚  查看:  评论:0
内容摘要:一台云服务器,ubuntu 22.04,装好nginx和python3,剩下的活就是把flask应用挂上去。听起来简单,真做起来,坑都在细节里。 先说我踩过最蠢的坑:直接跑flask run,然后浏览

一台云服务器,站点ubuntu 22.04,搭建装好nginx和python3,站点剩下的搭建活就是把flask应用挂上去。听起来简单,站点真做起来,搭建坑都在细节里。站点

先说我踩过最蠢的搭建坑:直接跑flask run,然后浏览器访问服务器IP,站点超时。搭建原因不复杂——flask自带的站点开发服务器只监听127.0.0.1,外面根本摸不到。搭建所以第一步,站点得让flask监听0.0.0.0,搭建比如app.run(host='0.0.0.0',站点 port=8000)。但就算这样,也只是内网能访问,公网还是不行,因为nginx还没上场。

nginx在这里的角色就是个反向代理。它监听80端口,收到请求后转发给本地8000端口上的flask进程。配置写起来很直白,在/etc/nginx/sites-available/下建个文件,比如myapp,内容大致是:

server {  listen 80; server_name your_domain_or_ip; location / {  proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } 

然后软链接到sites-enabled,nginx -t检查语法,systemctl reload nginx生效。这时候访问服务器IP,nginx会把请求转给flask,页面就出来了。

但别高兴太早。flask现在还是裸跑的,终端一关进程就死。得用gunicorn这类WSGI服务器来跑flask应用,它更稳定,支持并发。安装gunicorn后,启动命令长这样:

gunicorn -w 4 -b 127.0.0.1:8000 myapp:app

-w 4表示开4个工作进程,myapp:app是模块名和flask实例名。这样就算某个请求卡住,其他进程还能干活。不过gunicorn自己也不管进程守护,万一崩了没人拉起来。这时候用systemd最省事,写个service文件,让系统帮你管理gunicorn的生命周期。

在/etc/systemd/system/myapp.service里放:

[Unit] Description=My Flask App After=network.target [Service] User=www-data WorkingDirectory=/path/to/your/app ExecStart=/usr/bin/gunicorn -w 4 -b 127.0.0.1:8000 myapp:app Restart=always [Install] WantedBy=multi-user.target 

然后systemctl daemon-reload,systemctl enable --now myapp。这下进程管住了,开机自启也有了。

还有一个容易忽略的——静态文件。flask的/static路径默认自己处理,但性能不行。干脆让nginx直接接管,在server块里加一条:

location /static/ {  alias /path/to/your/app/static/; expires 30d; }

这样图片、css、js都不经过flask,nginx直接吐文件,快得多。我自己的经验是,一个页面加载时间能从300ms降到50ms左右,差别很明显。

最后说下域名和HTTPS。如果只是IP访问,80端口就够了。但真要上生产,加个证书是必须的。certbot一条命令就能搞定,它会自动改nginx配置,不用手动折腾。

整条链路跑通之后,我习惯在服务器上写个简单的健康检查脚本,定期curl一下本地8000端口,如果返回非200就重启服务。虽然systemd有Restart=always,但有些情况是进程活着但应用卡死,这时候重启逻辑得自己写。这些细节不处理,上线后半夜被报警吵醒是迟早的事。

对了,防火墙别忘了开。ubuntu默认ufw是关的,但云服务商的安全组规则得自己配。我见过有人nginx配好了,80端口安全组没开,白折腾半小时。检查顺序永远是:服务监听状态 → 本机curl → 外部telnet → 安全组规则。

这套东西跑起来之后,日常运维基本不用管。改代码就git pull然后systemctl restart myapp,日志看journalctl -u myapp -f。够用了。别搞什么docker k8s,小项目根本不需要那套复杂度。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap