Flask + Gunicorn + Nginx 搭建 Web 服务

Flask + Gunicorn + Nginx 搭建 Web 服务

Flask

Flask 是一个使用 Python 编写的轻量级 Web 框架,被广泛用于构建 Web 应用程序和 API, 开发者可以通过 Flask 在搭建本地 Web 服务。

1
2
3
4
5
6
7
8
9
from flask import Flask, request
app = Flask(__name__)

@app.route('/')
def index()
return "Hello World!"

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

这样,我们就创建了一个名为 app 的 Flask 应用程序,并定义了一个路由 /,当访问 127.0.0.1:5000 时 返回 “Hello World!”,

Gunicorn

Gunicorn 是一个 Python WSGI HTTP 服务器,它可以帮助开发者在生产环境中运行 Flask 应用程序。

1
2
3
4
5
6
7
8
9
10
➜  ~ gunicorn -h
usage: gunicorn [OPTIONS] [APP_MODULE]

options:
...
-b ADDRESS, --bind ADDRESS
The socket to bind. [['127.0.0.1:8000']]
...
-w INT, --workers INT
The number of worker processes for handling requests. [1]

将上述 Flask 程序保存为 example.py, 则

1
gunicorn -w 4 -b 0.0.0.0:5555 example:app

其中 example:app 代表了 example.py 中的 app 对象,启动后就可以通过 公网IP:端口访问。

Nginx

在 Nginx 的配置文件中添加一个新的服务器块,用于反向代理到 Gunicorn 服务器。进入Nginx 的默认配置文件目录 /etc/nginx/conf.d。新建 ${YOUR_SERVICE_NAME}.conf文件,内容可以参考

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name YourDomain.com;

location / {
proxy_pass http://127.0.0.1:${GUNICORN_SERVICE_PORT};
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

如果需要安装配置SSL证书,可以参考 免费SSL证书概述, 相应的配置文件可以参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
listen 80;
server_name YourDomain.com;

# 添加这一段用于重定向HTTP到HTTPS
location / {
# 注意,301会将 POST 转换为 GET
return 307 https://$host$request_uri;
}
}

server {
listen 443 ssl;
server_name YourDomain.com;

ssl_certificate <cert-file-name>.pem;
ssl_certificate_key <cert-file-name>.key;

# 其余的SSL配置,如ssl_protocols、ssl_ciphers等
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:${GUNICORN_SERVICE_PORT};
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 500s;
proxy_read_timeout 500s;
proxy_send_timeout 500s;
}
}

保存后检查是否存在语法错误并重启

1
2
3
nginx -s reload
nginx -t
sudo service nginx restart

之后再域名记录中添加一条 A Record,Value 值 为服务器地址,过后就可以通过域名访问服务器上的 Web 服务了。

Reference


Flask + Gunicorn + Nginx 搭建 Web 服务
https://blog.iks-ran.com/2024/01/15/build_web_service/
Author
iks-ran
Posted on
January 15, 2024
Licensed under