阿里云ECS部署python及flask(二)使用uwsgi emperor +Nginx部署自动启动多个web项目

本文详述在阿里云ECS上使用uwsgi emperor+Nginx部署多个Python Flask项目的方法,包括配置uwsgi和Nginx,设置权限,以及通过systemd实现服务自启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:本文是《阿里云ECS部署python及flask(一)》的续文,单个python项目的uwsgi和nginx都已能成功配置。
参考:

  • https://segmentfault.com/a/1190000010990529
  • https://www.cnblogs.com/piscesLoveCc/p/5867900.html
  1. 在系统环境下安装uwsgi(非python项目中的虚拟环境):

pip3 install uwsgi

  1. 新建一个目录:/etc/uwsgi/vassals,将各项目的uwsgi配置文件拷贝至该目录下面(这一步网上很多博客都说是做软链接ln -s,但不知为何我使用软链接不成功,最后无奈使用直接拷贝):

mkdir /etc/uwsgi && mkdir /etc/uwsgi/vassals
cp ~/first_project/f_uwsgi.ini /etc/uwsgi/vassals/
cp ~/second_project/s_uwsgi.ini /etc/uwsgi/vassals/

  1. 新建/etc/uwsgi/emperor.ini 文件,代码如下:
[uwsgi]
emperor = /etc/uwsgi/vassals
# uid = www
# gid = www

注(权限问题已解决,可参考:阿里云ECS部署python及flask(三)通过设置uid和gid来改变uwsgi+emperor通常使用root权限的问题
):

  • 由于我尚未搞清楚linux系统中用户和用户组权限问题,所以所有操作包括最后的自启动部署,都是在root下完成的。包括nginx.conf中的user也是root。
  • 我在这里给绕了好久,若真正部署起来全使用root权限还是不好,目前也是迫于无奈,待学习好用户权限问题后再做修改。
  • 权限问题会涉及:1、配置静态文件直接由Nginx处理;2、上边的emporer.ini。(由于我都是用root,所以uid和gid我都注释掉了)
  1. 新建/etc/systemd/system/emperor.uwsgi.service文件,代码如下:
[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
#uwsgi 服务的路径,以及需要启动的 ini 文件路径,根据自己的实际情况进行修改
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/emperor.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

另:为避免把一些敏感信息(数据库的帐号、密码等)直接写在程序中,可以把这些信息设置到服务器的环境变量当中,部署后程序就可以直接从服务器的环境变量当中读取。环境变量分两种,一种是当前用户的;一种是系统的(/etc/profile)。设置环境变量的时候,如果只是在shell中使用 “export XXX=xxx” 只是临时把这些信息保存在当前用户的环境变量不中,shell关闭后也会随着消失。建议最好是设置在系统环境变量中,即修改“/etc/profile”文件。如下:

vi /etc/profile

# 输入i,进入编辑模式,输入以下信息
export MYSQL_HOST="*****:***"
export MYSQL_USER="****"
export MYSQL_PWD="****"

#按"Esc"、"shift+:"、输入"wq"、回车:保存退出

# 运行/etc/profile,让系统环境变量起作用
source /etc/profile

这里有个坑:如此设置之后,正常情况下程序是可以正常读到系统环境变量。但 emperor 是作为 linux service 部署的,而启动 linux service 时会清空当前所有的环境变量,所以通过 emperor 部署后程序会找不到我们已经设置好的环境变量。为解决这个问题,需要修改一下 /etc/systemd/system/emperor.uwsgi.service,把环境变量放在里面:

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
#uwsgi 服务的路径,以及需要启动的 ini 文件路径,根据自己的实际情况进行修改
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/emperor.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
Environment=MYSQL_HOST=*****:***
Environment=MYSQL_USER=****
Environment=MYSQL_PWD=****

[Install]
WantedBy=multi-user.target
  1. 创建/usr/lib/systemd/system/nginx.service,(由于我是使用yum install nginx安装的,所以这个文件已经有了。)代码如下:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  1. 设置开机启动:

systemctl enable nginx.service
systemctl enable emperor.uwsgi.service

  1. 运行服务、停止服务、重启服务、状态查询:

systemctl start emperor.uwsgi.service
systemctl stop emperor.uwsgi.service
systemctl restart emperor.uwsgi.service
systemctl status emperor.uwsgi.service

systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service
systemctl status nginx.service

查看所有已启动的服务

systemctl list-units --type=service

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值