首页 > 解决方案 > 使用 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上

要做哪些改变?任何帮助,将不胜感激

标签: pythonubuntunginxflaskfirewall

解决方案


假设您的 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 服务器提供。


推荐阅读