Ubuntu服务器多Flask应用NGINX路由配置问题排查
解决NGINX反向代理多Flask应用的路径访问问题
你的问题出在NGINX对/dev路径的转发规则处理上,加上缺少必要的代理请求头,导致后端Flask应用无法正确接收请求。按下面的配置调整即可:
修正后的NGINX配置
server { server_name api.example.org; # 补上缺失的分号 listen 80; # 处理HTTP请求,统一跳转到HTTPS return 301 https://$host$request_uri; } server { server_name api.example.org; listen 443 ssl; # 监听HTTPS端口 # Let's Encrypt的证书路径,根据实际情况调整 ssl_certificate /etc/letsencrypt/live/api.example.org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.example.org/privkey.pem; # 根路径转发到8003端口的Flask应用 location / { proxy_pass http://127.0.0.1:8003; # 添加必要的代理请求头,让Flask能正确识别请求来源 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; } # /dev路径转发到1642端口的Flask应用 location /dev/ { # 末尾加斜杠,匹配所有以/dev/开头的路径 proxy_pass http://127.0.0.1:1642/; # 末尾加斜杠,把/dev后的路径映射到后端根路径 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; } # 可选:处理不带斜杠的/dev请求,自动跳转带斜杠的路径 location = /dev { return 301 https://$host/dev/; } }
关键调整说明
- 补上
server_name后的分号:原配置里少了分号,虽然nginx -t通过了,但规范配置避免意外问题。 - 拆分HTTP和HTTPS server块:原配置用
if判断跳转,拆分后更清晰且符合NGINX最佳实践。 location /dev/和proxy_pass末尾加斜杠:这是核心!如果不加斜杠,NGINX会把/dev作为路径前缀转发给后端,比如访问api.example.org/dev/hello会转发到http://127.0.0.1:1642/dev/hello,但你的Flask应用大概率没有/dev开头的路由,所以会404。加了斜杠后,NGINX会去掉/dev前缀,把后面的路径直接映射到后端根路径,也就是转发到http://127.0.0.1:1642/hello。- 添加代理请求头:Flask需要这些头部来获取正确的请求主机、客户端IP和协议,否则可能出现路由识别错误或无法获取真实IP的问题。
生效配置
修改完配置后,执行以下命令重载NGINX:
sudo nginx -s reload
现在访问https://api.example.org会指向8003端口的应用,访问https://api.example.org/dev/(或/dev下的子路径)会指向1642端口的应用。
内容的提问来源于stack exchange,提问作者Deepesh Singh
相关产品推荐
相关产品推荐

