Ubuntu系统下如何实现无需端口直接通过域名访问Flask服务
问题根本原因
HTTPS协议默认使用443端口,你当前把配置了SSL证书的Flask服务跑在80端口上,用户访问https://test.example.com时浏览器会默认请求443端口,而你的服务没监听这个端口,自然访问失败。你访问https://test.example.com:80能通是因为主动指定了请求80端口的HTTPS服务,不符合常规使用习惯。另外注意你的代码里ssl_conext是拼写错误,正确写法为ssl_context。
解决方案
方案1:直接修改Flask监听端口(适合测试场景)
把启动代码里的port参数改成443即可:
if __name__ == '__main__': app.run(host='0.0.0.0', port=443, ssl_context=context)
修改后重启Flask服务即可,注意1024以下的端口需要root权限启动,所以启动命令要加sudo,比如sudo python3 flask_server.py。
方案2:用Nginx做反向代理(生产环境推荐)
生产环境不建议直接用Flask自带的server对外提供服务,稳定性和性能都不足,用Nginx做反向代理是更合理的选择:
- 首先把Flask服务改成监听内部端口比如5000,不需要单独配置SSL(SSL交给Nginx处理即可),启动代码改成:
if __name__ == '__main__': app.run(host='127.0.0.1', port=5000)
- 安装Nginx:
sudo apt install nginx - 新增Nginx配置文件
/etc/nginx/sites-available/test.example.com,内容参考:
server { listen 80; server_name test.example.com; # 把HTTP请求跳转到HTTPS return 301 https://$host$request_uri; } server { listen 443 ssl; server_name test.example.com; # 配置SSL证书路径 ssl_certificate 你的证书pem文件路径; ssl_certificate_key 你的证书key文件路径; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 激活配置:
sudo ln -s /etc/nginx/sites-available/test.example.com /etc/nginx/sites-enabled/ - 测试配置是否合法:
sudo nginx -t - 重启Nginx生效:
sudo systemctl restart nginx - 可以把Flask服务配置成systemd服务后台自启,避免退出终端就停止服务。
内容的提问来源于stack exchange,提问作者Neha Mangla
相关产品推荐
相关产品推荐

