配置miniconda+Gunicorn+Flask作为系统服务并通过Nginx实现反代

1. 前言

使用miniconda作为Gunicorn和Flask的运行环境,通过系统服务挂载Conda环境下的Gunicorn运行Flask网站,并配置Nginx作为反向代理实现在同一个服务器上利用conda隔离多个Flask网站并按照不同的子域名访问。

2. 环境配置

  1. 安装miniconda,假设安装到/home/ubuntu/目录下,指令:

#获取安装脚本(默认是64位)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

#执行安装脚本
bash ~/Miniconda3-latest-Linux-x86_64.sh

一路yes加回车,但是最后一步选择no,即不自动初始化

#初始化环境
source <PATH_TO_CONDA>/bin/activate
conda init --all

#在conda环境依然激活的情况下,配置开机或登录仅运行conda但不进入base环境
conda init --all

经过上面的配置,如果没有改安装脚本里面的安装地址,会把miniconda装在home/用户名/miniconda目录下。

安装过程可以参考官方文档

  1. 配置conda环境,和平时新建一个conda环境没什么区别,用pip安装好对应的包以及Flask和Gunicorn即可

#新建一个名为web的conda环境
conda create -n web python=3.10.14

#激活conda环境,用pip安装各种依赖以及Flask和Gunicorn
conda activate web
pip install Flask gunicorn

  1. 配置系统服务,首先新建一个名叫web.service的系统服务

#需要管理员权限,在/etc/systemd/system下新建文件web.service
sudo vim /etc/systemd/system/web.service

文件内容如下

[Unit]
Description=Gunicorn instance to serve Flask application
After=network.target

[Service]
# 这里的User代表运行程序的用户名,按照上面的配置,是ubuntu,根据实际修改
User=ubuntu

# 通常设置成 www-data 或 nginx 组,根据服务器设置决定,一般来说,nginx代理是使用www-data组
Group=www-data

# 到你Flask程序的路径,没什么好说的
WorkingDirectory=/path/to/your/app

# 使用 web 环境下的 gunicorn 命令启动 Flask 应用:假设入口为 main:app并记录日志到指定位置
# 日志位置必须是上面User里面用户可以访问的位置,强烈建议设置为自己的home文件夹
# 你必须先建立文件夹,否则会报错,gunicorn会自动创建日志文件但不会自动创建路径
# 3个worker可以根据实际调整,通常是2xCPU核心+1个,8000端口也可以改
ExecStart=/home/ubuntu/miniconda/envs/web/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 main:app \
        --access-logfile /home/ubuntu/log/access.log --error-logfile /home/ubuntu/log/error.log


# 出现异常时自动重启
Restart=always
RestartSec=10

# 如有需要,可设置额外的环境变量(例如:设置 Flask 运行环境为生产环境)
Environment="FLASK_ENV=production"
Environment="PATH=/opt/anaconda/envs/pft/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"

[Install]
WantedBy=multi-user.target

上述文件新建之后,刷新服务并设置为自动启动,使用status可以查看服务状态

sudo systemctl daemon-reload
sudo systemctl start web.service
sudo systemctl enable web.service
  1. 安装Nginx并配置反向代理

sudo apt install nginx

一个大概的配置文件如下所示,推荐使用NginxUI图形化配置,并且自带了SSL证书

server {
    listen 80;
    server_name yourdomain.com;  # 请替换成你的域名

    location / {
        # 将请求转发到 Gunicorn 服务
        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;
    }

3.可能遇到的问题

1.static目录下的东西不能被正确代理

由于Gunicorn和Flask的配置,有的时候并不能直接访问static目录下的内容,并且更高效的方法是通过Nginx直接代理static目录下的静态内容,这样可以直接由Nginx返回静态内容,降低系统开销,不需要gunicorn再做一次转发,首先,nginx的用户组是www-data,而一般放flask网站的文件夹是自己的home路径,所以要么将网站放到nginx能访问的/var/www/下,要么给nginx访问自己home路径的权限,使用下面的指令给static文件夹赋予www-data用户组。这可以确保文件是你拥有的,但是nginx可以访问

sudo chown -R ubuntu:www-data /home/ubuntu/web/static

建议额外设置所有文件夹是755,文件是644,nginx配置添加location块:

location /static/ {
    alias /path/to/your/app/static/;
}


配置miniconda+Gunicorn+Flask作为系统服务并通过Nginx实现反代
http://localhost:8090//archives/pei-zhi-miniconda-gunicorn-flaskzuo-wei-xi-tong-fu-wu-bing-tong-guo-nginxfan-dai
作者
空离
发布于
2025年02月26日
许可协议