Gunicorn + Nginx+systemd 配置flask

启动gunicorn

复制代码
仅仅内部访问
gunicorn -w 4 -b 127.0.0.1:8002 app:app
或 外部也可访问
gunicorn -w 4 -b 0.0.0.0:8002 app:app

配置nginx服务

复制代码
ubuntu@VM-4-3-ubuntu:/etc/nginx/sites-available$ cat zhiliao_oa
server {
    listen 80;
    server_name flask.larance.xyz; # 替换为你的域名或IP
    client_max_body_size 10M;    # 限制上传文件大小(可选)

    # 静态文件服务 - 让Nginx直接处理,效率最高
    location /static/ {
        alias /home/ubuntu/zhiliao_oa/static/; # 替换为你的静态文件绝对路径
        expires 30d;                           # 客户端缓存30天
        access_log off;                        # 可选:关闭静态文件访问日志减少IO
        add_header Cache-Control "public, immutable"; # 缓存控制头
    }

    # 动态请求 - 代理到Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8002;

        # 传递必要的HTTP头
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $server_name;

        # 超时设置(根据应用调整)
        proxy_connect_timeout 75s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;


        # 上传大文件可能需要
        # proxy_request_buffering off;
    }

}

配置环境中遇到的一个小问题 访问 访问静态文件403

此前已经修改了静态目录权限

复制代码
sudo chown -R www-data:www-data /home/ubuntu/zhiliao_oa/static/
sudo chmod -R 755 /home/ubuntu/zhiliao_oa/static/

当时访问静态文件依然403,后来发现上级目录的权限不对

使用 systemd 服务

创建 systemd 服务文件:

复制代码
sudo vi /etc/systemd/system/flask.service

内容:

复制代码
ubuntu@VM-4-3-ubuntu:~/zhiliao_oa$ cat /etc/systemd/system/flask.service
[Unit]
Description=Gunicorn instance to serve flask
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/zhiliao_oa
ExecStart=/usr/bin/gunicorn --workers 4 --bind 0.0.0.0:8002 app:app
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
ubuntu@VM-4-3-ubuntu:~/zhiliao_oa$
复制代码

然后:

复制代码
# 启动服务
sudo systemctl start flask

# 停止服务
sudo systemctl stop flask

# 重启服务
sudo systemctl restart flask

# 查看状态
sudo systemctl status flask

验证是否已杀死

复制代码
# 检查是否还有 gunicorn 进程
ps aux | grep gunicorn | grep -v grep

# 检查端口是否还在监听
netstat -tlnp | grep :8002
lsof -i :8002
# 如果没有输出,说明进程已停止

注意事项

复制代码
优雅停止 vs 强制停止:

kill -TERM 或 kill -15:优雅停止,让进程完成当前请求

kill -KILL 或 kill -9:强制停止,立即终止

多个实例:
如果运行了多个 Gunicorn 实例,需要指定正确的进程ID或端口

权限问题:
如果使用 sudo 启动,可能需要 sudo 来停止

推荐使用 pkill gunicorn 或 kill $(lsof -t -i:8002),这两种方法最简单直接。
相关推荐
吴声子夜歌2 小时前
Nginx应用与运维——Nginx集群负载与配置管理(二)
运维·nginx
cpolar技术支持2 小时前
外网测试机的异常传不回内网?自托管 Sentry,用 cpolar 打通错误上报链路
python·nginx·docker·cpolar·sentry
吴声子夜歌6 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(一)
运维·nginx·kubernetes
螺蛳粉 螺蛳粉7 小时前
第一篇:Keepalived 高可用实战:VIP 漂移与 Nginx 主备切换完整指南
运维·nginx·负载均衡·keepalived·高可用
吴声子夜歌8 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(三)
运维·nginx·kubernetes
吴声子夜歌9 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(二)
运维·nginx·kubernetes
Wang's Blog18 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
Lsetea21 小时前
Nginx加载证书时报SSL_CTX_use_PrivateKey_file失败:私钥配对与权限排查
nginx·https·ssl证书·私钥·证书部署
昔我往昔1 天前
Blueprint和route的区别
flask
吴声子夜歌1 天前
Nginx应用与运维——Nginx负载均衡应用实战(二)
运维·nginx·负载均衡