LinMinquan's Blog

Experience technology to change life

Python Flask Gunicorn Nginx CentOS Deploy SSL Https 多个App 部署

Centos 6,Python 2.7,阿里云ECS,

参考文章:

链接1:centos下通过gunicorn+nginx+supervisor部署Flask项目

链接2:Flask+Gunicorn+Nginx配置多个app

链接3:Virtual Hosts on nginx (CSC309)

我的需求是想在阿里云(Centos)上部署Flask的App,当然我想部署多个App在上面,另外我还会部署https。

链接1的文章写得特别好,但我需要部署https,这个是需要要nginx里配置的。我之前的部署方案也可以支持https,但据说会不稳定,方法是 Python Flask 支持 https Let’s Encrypt 。

nginx的坑。刚开始用nginx时,会发现它有很多个配置文件,网上不同的教程打开的配置文件都不一样,不同操作系统的配置文件目录也可能不同。真是非常崩溃。但后面也很好理解,它其实有一个主的配置文件,主的配置文件里可以包含其它的配置文件,这样它就把配置不同功能的配置文件分开了,比如说有专门配置ssl的配置文件ssl.conf。这样可以减少因为配置错误导致整体功能不可用的情况,单个配置文件错误的话至少只有相应的功能不可用。

其实你启动nginx后,在浏览器中进入nginx的默认页面,它就告诉你了它的配置文件在哪,Centos中是在 /etc/nginx/nginx.conf ,打开这个配置文件,你会注意到它里面有 include 这个词,这个是用于去包含其它目录下的配置文件。

配置https的证书我是在 sslforfree.com 上搞的,用的是Let’s Encrypt 的免费证书。

vi /etc/nginx/conf.d/ssl.conf

#
# HTTPS server configuration
#

server {
    listen       443 ssl http2 default_server;
#    listen       [::]:443 ssl;
    server_name  aliyun.cgtiger.com;
    root         /usr/share/nginx/html;
    access_log   /etc/nginx/conf.d/nginx_access.log;

    ssl on;
    ssl_certificate certificate.crt;
    ssl_certificate_key private.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
        proxy_pass http://127.0.0.1:5003;
        proxy_redirect off;
        proxy_set_header Host &host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /test {
        rewrite ^/test(.*) /$1 break;
        proxy_pass http://127.0.0.1:5000;
    }

    location /weixin {
        rewrite ^/weixin(.*) /$1 break;
        proxy_pass http://127.0.0.1:5001;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

上面是我的配置。

测试时用 https://xx.example.com/test ,主要是指定证书,其它的ssl配置我都默认。我加了个ssl on 。

在做多app配置时我遇到一个问题,“ location / ”时可以,但“location /test”时不行(报404错误),解决这个办法请参考链接3。原因是nginx把 /test 这个发给Flask App,但我的Flask App里没有处理这个路由,所以报错了。


Share