如何为子域名配置 Nginx 反向代理到 Flask 应用
在这篇博客中,我将介绍如何为你的域名添加子域名,并使用 Nginx 反向代理将子域名请求转发到 Flask 应用。我们将以子域名 app1.example.com
为例,并通过 Nginx 将请求转发到 Flask 应用的 5000 端口。
1. 前提条件
- 你已经拥有一个域名,并且域名已经正确解析到你的服务器。
- 服务器上已经安装了 Nginx,并且 Flask 应用运行在本地的 5000 端口上。
步骤 1:为子域名添加 DNS 解析
首先,我们需要为子域名 app1.example.com
添加一条 A记录
,指向服务器的公网 IP。
1.1 登录 DNS 提供商控制台
- 登录你的 DNS 提供商的控制台(例如 Cloudflare、阿里云等)。
- 在控制台中,找到 域名解析 或 DNS设置 页面。
1.2 添加子域名的 A 记录
- 在 域名解析 页面中,找到你要配置的主域名(例如
example.com
),并点击进入该域名的解析设置页面。 - 点击页面上的 添加记录 按钮。
- 填写以下信息:
- 主机记录:填写
app1
。 - 记录类型:选择
A记录
。 - 解析线路:选择
默认
。 - 记录值:填写服务器的公网 IP 地址(例如
192.168.1.100
)。 - TTL:建议设置为 10 分钟或 1 小时。
- 主机记录:填写
- 点击 保存。
这样,你已经为 app1.example.com
添加了一条解析记录。
步骤 2:在 Nginx 中为子域名配置反向代理
接下来,我们将在 Nginx 中配置反向代理,将 app1.example.com
的请求转发到 Flask 应用的 5000 端口。
2.1 Nginx 配置文件的结构
假设你已经使用宝塔面板或其他方式安装了 Nginx。接下来,我们将为子域名 app1.example.com
创建新的站点配置文件,并将其与 Flask 应用集成。
2.2 修改 Nginx 配置文件
-
打开你的服务器,进入 Nginx 配置目录(宝塔面板的默认路径是
/www/server/panel/vhost/nginx/
)。 -
为子域名
app1.example.com
创建一个新的配置文件,命名为app1.example.com.conf
。 -
在文件中添加以下配置内容:
# 重定向 HTTP 到 HTTPS server { listen 80; server_name app1.example.com; return 301 https://$host$request_uri; } # 处理 HTTPS 请求 server { listen 443 ssl http2; server_name app1.example.com; # SSL 证书配置 ssl_certificate /www/server/panel/vhost/cert/app1.example.com/fullchain.pem; ssl_certificate_key /www/server/panel/vhost/cert/app1.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:!aNULL:!MD5:!DSS; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000" always; # 反向代理到 Flask 应用的 5000 端口 location / { proxy_pass http://127.0.0.1:5000; # Flask 应用运行在 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; } # 日志配置(可选) access_log /www/wwwlogs/app1.example.com.access.log; error_log /www/wwwlogs/app1.example.com.error.log; }
2.3 配置说明:
- HTTP 重定向到 HTTPS:通过
server
块中的return 301
实现,将所有 HTTP 请求重定向到 HTTPS。 - SSL 证书:确保你已经通过宝塔面板或其他方式申请了
app1.example.com
的 SSL 证书,并将ssl_certificate
和ssl_certificate_key
指向正确的证书文件路径。 - 反向代理:
proxy_pass
将子域名的请求转发到本地运行的 Flask 应用(监听 5000 端口)。 - 日志记录:配置访问和错误日志,方便调试。
2.4 重新加载 Nginx 配置
修改完成后,保存文件并重新加载 Nginx 配置,以使新站点生效:
sudo nginx -s reload
步骤 3:验证配置
3.1 测试域名解析
在完成子域名解析配置后,执行以下命令来测试解析是否生效:
ping app1.example.com
如果解析成功,应该会看到该子域名解析到你的服务器公网 IP 地址。
3.2 测试访问
在浏览器中访问 https://app1.example.com
,检查是否可以正确访问你的 Flask 应用。
步骤 4:排查问题
-
如果你遇到
502 Bad Gateway
错误,检查 Nginx 错误日志/www/wwwlogs/app1.example.com.error.log
。 -
确保 Flask 应用在服务器的 5000 端口上运行,使用以下命令检查端口状态:
netstat -tuln | grep 5000
如果 DNS 解析未生效,检查域名解析设置是否正确,确保
A记录
指向正确的服务器 IP。