# Flask + uWsgi + Nginx 搭建后端服务器

# 一、配置 Python Venv 虚拟环境

在Ubuntu 系统下,有python 2 和 python 3 两个版本,所以使用虚拟环境,以指定python运行环境。虚拟环境的创建,以及后续uWsgi全部由普通用户角色安装与执行。

# 创建虚拟环境
python3 -m venv venv

# 安装 Flask
pip install --upgrade pip
pip install -U setuptools
pip install flask

# Python Venv 的基本操作

# 进入虚拟环境
source ./venv/bin/activate 

# 退出虚拟环境
deactivate

# 二、完成 Flask 项目

编写 main.py

# filename: main.py
from flask import Flask

app = Flask(__name__)

# 这里启用 Flask 跨域访问,不启动则 Vue 无法访问
CORS(app, supports_credentials=True)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
    
if __name__ == "__main__":
    # 这里指定 Flask 启动时的端口,方便调试
    app.run(host='0.0.0.0', port='5000')
else:
    # 这里指定 uWsgi 应用实例名,如果不加这句,那么 uWsgi 无法正确运行项目
    application = app

# Flask 项目的启动与调试

# 如果 main.py 中,运行代码未指定主机地址与端口号
# app.run()
# 那么 Flask 服务使用以下方式启动,以指定主机地址与端口号
flask run --host=0.0.0.0 --port=8080

# 如果 main.py 中,运行代码已指定主机地址与端口号
# app.run(host='0.0.0.0', port='5000')
# 那么使用 python 直接运行代码即可
python main.py

# 三、uWsgi的安装与配置

uWsgi在Venv环境中使用 pip 安装,无需root权限

pip install uwsgi

# 编写uWsgi 配置文件

# filename uwsgi.ini
[uwsgi]

# 由 nginx 代理时,使用以下方式指定 Flask 地址和端口号
socket = 127.0.0.1:5000

# 如果不使用 socket ,直接用 uWsgi 启动程序,则用 http
# http = 0.0.0.0:5000

# 设定 Flask 应用的根目录
chdir = /home/ubuntu/proj/helloworld

# 指定应用的入库文件
wsgi-file = main.app

# 指定 Flask 对象
callable = app

# 设定应用进程的数量
processes = 2

# 设定每个进程的线程数量
threads = 2

# 设定是否启动主线程
master = true

# 设定日志的打印文件
daemonize = /home/ubuntu/proj/helloworld/logs/uwsgi.log

# 设定主进程 pid 的写入文件
pidfile = uwsgi.pid

# 设定虚拟环境的路径
virtualenv = /home/ubuntu/proj/helloworld/venv

# 测试 uWsgi

uWsgi安装完成后,可以先不加载 uwsig.ini 文件,而是从命令行直接启动,以检查uWsgi 以及 Flask 项目是否能正常运行

# 命令一
uwsgi --http-socket :8088 --wsgi-file main.py

# 命令二
uwsgi --http :8001 --wsgi-file main.py

# 运行 uWsgi

# 启动 uwsgi
uwsgi --ini uwsgi.ini

# 停止 uwsgi
uwsgi --stop uwsgi.pid

# 重启 uwsgi
uwsgi --reload uwsgi.pid

启动后,可以查看 /logs/uwsgi.log 日志,排查问题

可以执行以下命令,来检查uwsgi工作状态

# 查看进程
ps -aux | grep uwsgi

# 查看端口
netstat -anp | grep 8088 

注意:

这个地方uWsgi已配置文件启动之后,即使端口打开,外网也是访问不了的,如何让外部直接访问uWsgi,还没试验成功(ini文件中,将socket改成http无效)

# 四、Nginx 的安装与配置

Nginx 务必使用 root 权限安装与配置,以免出现各种权限不足问题

apt-get install nginx

# Nginx 配置文件编写

nginx 配置文件路径为:/etc/nginx/nginx.conf

http {
    server {
        # 监听端口
        listen 80;

        # 监听ip 换成服务器公网IP
        server_name ***.***.***.***;

        # 监听域名 换成服务器解析域名 与上面二选其一
        # server_name xxx.baidu.com

        # 动态请求
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:5000;
        }

        # 静态请求
        # location /static {
        # alias /root/face/server/static/;
        # } 
    }
}

# Nginx 的基础操作

# 启动 Nginx
nginx 

# 停止 Nginx
nginx -s stop

# 重启 Nginx
nginx -s reload

# Nginx 的几个配置案例

http {
    # 代理 Vue
	server {
    	listen 80;
		server_name xxx.mallocx.com;
    	location / {
    		root /home/your/vue/path/dist;
    		index index.html
    		try_files $uri $uri/ /index.html
		}
    }
	
	# 代理 Flask
	server {
    	listen 5000;
		server_name xxx.mallocx.com;
    	location / {
    		include uwsgi_params;
        	uwsgi_pass 127.0.0.1:5010
		}
    }
	
	# 代理 Https Vue
	server {
        listen 443 ssl;
        server_name xxx.mallocx.com;
        ssl_certificate /home/your/certificate/mallocx.com_bundle.crt;
        ssl_certificate_key /home/your/certificate/mallocx.com.key;
    	location / {
    		root /home/your/vue/path/dist;
    		index index.html
    		try_files $uri $uri/ /index.html
		}
	}
}

注意:

nginx配置文件,第一行权限设置,必须要改为user root; 否则不解析