温馨提示×

Python Web应用在Debian怎么部署

小樊
34
2025-12-28 17:46:13
栏目: 编程语言

在 Debian 上部署 Python Web 应用的推荐做法

使用 Nginx + Gunicorn + systemd 是生产环境的主流方案:Nginx 负责反向代理与静态资源,Gunicorn 作为 WSGI 服务器承载应用,systemd 保证进程常驻与开机自启。下面给出可直接落地的步骤与要点。


一 准备与安装

  • 更新系统并安装基础工具与运行时:
    • 执行:sudo apt update && sudo apt upgrade -y
    • 安装:sudo apt install python3 python3-pip python3-venv nginx -y
  • 准备代码与依赖:
    • 建议将代码放在如 /var/www/myproject 或用户目录,使用 Git 拉取或上传发布包。
    • 在项目根目录创建虚拟环境:python3 -m venv venv && source venv/bin/activate
    • 安装依赖:pip install -r requirements.txt(示例依赖:Flask/Gunicorn)。

二 以 Flask 为例的最小可用部署

  • 示例应用 app.py(确保应用实例名为 app):
    • 代码:
      from flask import Flask
      app = Flask(__name__)
      @app.route('/')
      def hello():
          return "Hello, Flask on Debian!"
      if __name__ == '__main__':
          app.run()
      
  • 用 Gunicorn 启动(仅本地监听,便于与 Nginx 配合):
    • 命令:venv/bin/gunicorn -b 127.0.0.1:8000 app:app
    • 如用配置文件 gunicorn_config.py
      bind = '127.0.0.1:8000'
      workers = 3
      
      启动:venv/bin/gunicorn -c gunicorn_config.py app:app
  • 配置 Nginx 反向代理(/etc/nginx/sites-available/myproject):
    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;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    • 启用并生效:
      • sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
      • sudo nginx -t && sudo systemctl reload nginx
  • 访问测试:浏览器打开 http://your_domain_or_ip,应看到 “Hello, Flask on Debian!”。

三 使用 systemd 托管 Gunicorn

  • 创建服务文件 /etc/systemd/system/myproject.service
    [Unit]
    Description=Gunicorn daemon for myproject
    After=network.target
    
    [Service]
    User=your_username
    Group=www-data
    WorkingDirectory=/path/to/myproject
    ExecStart=/path/to/myproject/venv/bin/gunicorn -c /path/to/myproject/gunicorn_config.py app:app
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  • 启动与开机自启:
    • sudo systemctl daemon-reload
    • sudo systemctl start myproject && sudo systemctl enable myproject
  • 常用运维:
    • 查看日志:sudo journalctl -u myproject -f
    • 平滑重载:sudo systemctl reload myproject
    • 重启 Nginx:sudo systemctl reload nginx

四 安全与网络配置

  • 防火墙放行 HTTP/HTTPS:
    • sudo ufw allow 'Nginx Full' && sudo ufw enable
  • 启用 HTTPS(Let’s Encrypt):
    • 安装:sudo apt install certbot python3-certbot-nginx -y
    • 获取并自动配置证书:sudo certbot --nginx -d your_domain_or_ip
    • 按提示选择是否重定向 HTTP→HTTPS,证书将自动续期。
  • 静态文件优化(可选):
    • 在 Nginx 中为静态资源单独 location,例如:
      location /static/ {
          alias /path/to/myproject/static/;
          expires 1y;
          add_header Cache-Control "public, immutable";
      }
      
    • 将 Gunicorn 仅用于动态请求,减轻后端压力。

五 其他可选方案与排错要点

  • 可选方案
    • Apache + mod_wsgi:适合已有 Apache 栈的团队。要点是启用 mod_wsgi、配置 WSGIDaemonProcess/WSGIScriptAlias 指向虚拟环境与 WSGI 入口。
    • uWSGI + Nginx:高性能方案,使用 .ini 配置应用与 socket,Nginx 通过 uwsgi_pass 与 uWSGI 通信(Unix socket 优先)。
    • Docker:便于环境一致与快速交付。示例 Dockerfile(以 Nginx 托管静态站为例):
      FROM nginx:latest
      COPY . /usr/share/nginx/html
      EXPOSE 80
      
      构建与运行:docker build -t mywebapp . && docker run -d -p 80:80 mywebapp。如需域名与证书,可在宿主机再用 Nginx 反代或配合 Certbot。
  • 快速排错清单
    • 服务状态:systemctl status myprojectjournalctl -u myproject -f
    • Nginx 配置与语法:sudo nginx -tsudo systemctl reload nginx
    • 端口与连通性:ss -tlnp | grep ':80\|:8000',云服务器安全组/防火墙放行 80/443
    • 应用日志与错误输出:检查项目日志与 Gunicorn 日志,确认 wsgi:application 入口、工作目录与权限正确。

0