让自己的 nginx + uwsgi + flask 项目支持 https

东方鹗

本人的博客使用的是 nginx + uwsgi + flask 的模式,对外提供的是一般的 http 服务,在 chrome 要对所有的 http 服务“赶尽杀绝”的时候,拥有一个 https 服务是相当必要的。恰巧,certbot 能够提供免费的证书。深得我心。现在就来试试 https 服务。

安装certbot-nginx

确保你的服务器上安装有 git。

在当前目录进行安装,你可以确定 自己的目录

git clone https://github.com/certbot/certbot.git

生成证书

$ sudo ./letsencrypt-auto certonly

设置 nginx.conf

打开你的项目的 nginx 配置文件, 设置为如下两种方法(任选一种):

1、第一种设置方法

server {
        listen 80;
        listen 443 ssl;
        server_name os373.cn; # 自己的网站域名
        charset utf-8;
        client_max_body_size 75M;

        if ($scheme = http) {
                return 301 https://$host$request_uri;
        } # 让 http 跳转到 https

        ssl_certificate /etc/letsencrypt/live/demo.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/demo.com/privkey.pem;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        add_header Strict-Transport-Security 'max-age=31536000; preload';
        add_header X-Frame-Options DENY;
        add_header X-Xss-Protection 1;


        location / {
                try_files $uri @pyblog;
        }
        location @pyblog {
                include uwsgi_params;
                uwsgi_pass unix:/var/www/项目目录/项目_uwsgi.sock;
        }
}

2、第二种方法

server {
        listen 80;
        server_name www.os373.cn; # 自己的网站域名
        charset utf-8;
        #告诉浏览器有效期内只准用 https 访问
        add_header Strict-Transport-Security max-age=15768000;
        #永久重定向到 https 站点
        return 301 https://$server_name$request_uri;

}

server {
        #启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复.
        listen 443 ssl http2 fastopen=3 reuseport;
        server_name www.os373.cn; # 自己的网站域名
        #告诉浏览器不要猜测mime类型
        add_header X-Content-Type-Options nosniff;
        charset utf-8;
        client_max_body_size 75M;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/www.os373.cn/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.os373.cn/privkey.pem;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
        #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法.
        ssl_prefer_server_ciphers on;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        add_header Strict-Transport-Security 'max-age=31536000; preload';
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Xss-Protection 1;


        location / {
                try_files $uri @pyblog;
        }
        location @pyblog {
                include uwsgi_params;
                uwsgi_pass unix:/var/www/pyblog/pyblog_uwsgi.sock;
        }

重启 nginx 服务,不同的系统有不同的启动方法,请自行重启。

配置 haproxy

由于本人的多台内网服务器通过统一的一个外网网关,使用 haproxy 提供对外服务,所以需要对 haproxy 进行设置。

haproxy 不需要再重新编译以支持 ssl

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 20000
        chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        #option  httplog
        option  dontlognull
        retries 3
        option  redispatch
        maxconn 20000
        timeout connect 500000
        timeout client  500000
        timeout server  500000

frontend frontend_server2
        bind *:443
        mode    tcp
        acl is_www.demo.cn hdr_reg(host) -i www.demo.cn
        use_backend backend_server66 if is_www.demo.cn

        default_backend backend_server66

backend backend_server66
        mode    tcp
        balance roundrobin
        server server66 172.21.204.213:443 weight 66 maxconn 512 check


frontend frontend_server1
        bind *:80
        mode http
        acl is_www.demo.com hdr_reg(host) -i www.demo.com
        use_backend backend_server1 if is_www.demo.com

        default_backend backend_server1
        #default_backend backend_default

backend backend_server1
        mode http
        balance roundrobin
        server server1 172.21.204.213:80 weight 1 maxconn 512 check

重启 haproxy 服务,不同的系统有不同的启动方法,请自行重启。

证书到期更新

进入到第一步 git 后得到的 certbot 目录,然后执行下一步即可。

$ sudo ./certbot-auto renew

  • 打赏