Linux部署Python Web服务

以下展示了在 Linux 上部署 Flask 应用时,使用 Nginx 和 Gunicorn 配合的两种绑定方式:绑定端口绑定 UNIX 套接字 (.sock) 的完整流程。


1. 准备工作

确保已经安装以下组件:

sudo apt update
sudo apt install python3 python3-pip python3-venv nginx

创建 Flask 项目,并进入其目录:

mkdir flask_app
cd flask_app
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn

创建 app.py 示例文件:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, Flask with Nginx and Gunicorn!"

if __name__ == "__main__":
    app.run()

2. 使用 Gunicorn 绑定到端口

2.1 启动 Gunicorn 绑定端口

运行 Gunicorn,将应用绑定到指定端口(例如 5000):

gunicorn -w 4 -b 0.0.0.0:5000 app:app

2.2 配置 Nginx 代理到端口

编辑 Nginx 配置文件 /etc/nginx/sites-available/flask_app

server {
    listen 80;
    server_name your-server-ip-or-domain;

    location / {
        proxy_pass http://127.0.0.1:5000;
        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;
    }
}

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled/
sudo nginx -t  # 测试配置
sudo systemctl restart nginx

2.3 配置 Systemd 服务管理端口绑定的 Gunicorn

创建 systemd 服务文件 /etc/systemd/system/flask_app_port.service

[Unit]
Description=Gunicorn instance to serve Flask app (Port)
After=network.target

[Service]
User=your-username
Group=www-data
WorkingDirectory=/path/to/your/flask_app
Environment="PATH=/path/to/your/flask_app/venv/bin"
ExecStart=/path/to/your/flask_app/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app

[Install]
WantedBy=multi-user.target

启动并启用服务:

sudo systemctl start flask_app_port
sudo systemctl enable flask_app_port

3. 使用 Gunicorn 绑定到 UNIX 套接字

3.1 启动 Gunicorn 绑定 UNIX 套接字

运行 Gunicorn,绑定到 .sock 文件:

gunicorn -w 4 -b unix:/path/to/your/flask_app/flask_app.sock app:app

设置 .sock 文件权限:

sudo chmod 766 /path/to/your/flask_app/flask_app.sock

3.2 配置 Nginx 代理到 .sock

编辑 Nginx 配置文件 /etc/nginx/sites-available/flask_app_sock

server {
    listen 80;
    server_name your-server-ip-or-domain;

    location / {
        proxy_pass http://unix:/path/to/your/flask_app/flask_app.sock;
        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;
    }
}

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/flask_app_sock /etc/nginx/sites-enabled/
sudo nginx -t  # 测试配置
sudo systemctl restart nginx

3.3 配置 Systemd 服务管理 .sock 绑定的 Gunicorn

创建 systemd 服务文件 /etc/systemd/system/flask_app_sock.service

[Unit]
Description=Gunicorn instance to serve Flask app (Socket)
After=network.target

[Service]
User=your-username
Group=www-data
WorkingDirectory=/path/to/your/flask_app
Environment="PATH=/path/to/your/flask_app/venv/bin"
ExecStart=/path/to/your/flask_app/venv/bin/gunicorn -w 4 -b unix:/path/to/your/flask_app/flask_app.sock app:app

[Install]
WantedBy=multi-user.target

启动并启用服务:

sudo systemctl start flask_app_sock
sudo systemctl enable flask_app_sock

4. 测试部署

端口绑定方式

访问 http://<your-server-ip>,Nginx 将代理到 Gunicorn 的 5000 端口。

UNIX 套接字方式

访问 http://<your-server-ip>,Nginx 将代理到 Gunicorn 的 .sock 文件。


5. 对比两种方式

方式 优点 缺点
绑定端口 配置简单,容易调试。 性能略低,适合小型应用。
绑定 UNIX 套接字 更高性能(避免 TCP/IP 网络栈开销),适合高并发场景。 配置稍复杂,需管理 .sock 文件权限。

注意:该内容由由AIGC提供。

posted @ 2025-01-20 15:32  长空nice  阅读(15)  评论(0编辑  收藏  举报