python - 使用 Nginx 和 Gunicorn 的 Flask 应用程序,使用 IP:Port 的自定义域名
问题描述
我已经在 Ubuntu 上部署了一个带有 Gunicorn 和 Nginx 服务请求的 Flask 应用程序
Nginx 配置:
server {
server_name server_name domain_name;
location / {
include proxy_params;
proxy_pass http://unix:/home/darshit/myproject/myproject.sock;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; # managed by
Certbot
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = domain_name) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name server_name domain_name;
return 404; # managed by Certbot
}
现在,应用程序接受 443 端口上的 httos 请求。私有 ip 已映射到公共 ip,服务器的 443 端口已映射到端口 9991 上的请求。为了通过 Internet 访问应用程序,用户必须点击:https://domain_name:9991
我希望应用程序在不提及端口名称的情况下提供请求,即在https://domain_name上
要做哪些改变?任何帮助,将不胜感激
解决方案
假设您的 gunicorn 正在侦听端口 9991,您需要将 nginx 配置为对它的上游请求。
这是你如何做到的:
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location /static {
alias /path/to/static/folder/of/application;
}
location / {
proxy_pass http://localhost:9991;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
注意事项:
第一个代码块在端口 80 上侦听任何连接,并简单地永久重定向到端口 443。这是必需的,以便如果您的用户键入http://example.com,它应该重定向到https://example。 com
现在,第二个块在端口 443 上侦听与下面配置的密钥的安全连接,并且基本上将请求上游到运行 gunicorn 的端口 9991。
专业提示:我添加了一个附加块,location /static
它基本上匹配其中的任何请求,/static
并从应用程序的静态文件夹中提供它。图像、样式表等静态文件不应由您的应用程序服务器提供,理想情况下应由 nginx 等 Web 服务器提供。
推荐阅读
- sympy - 无法在 Sympy 中获得 tanh 函数的数值结果
- javascript - Google Sheets Changelog onEdit() 脚本不返回数据,只重复标题
- webstorm - WebStorm 删除空类/函数中的换行符
- typescript - 在 TypeScript 中导入 ipfs
- html - 顶部和左侧 css 值在我的代码中不起作用
- node.js - 安装引导程序后反应应用程序本地主机损坏
- postgresql - 从另一个表中插入一个 Postgres 表?
- azure - 运行 Azure Kubernetes 服务的 Web 前端示例的 URL 请求超时错误
- node.js - Bootstrap 不通过 npm 创建节点模块文件夹
- java - 在 JavaFX 中绑定对象