Nginx设置HTTPS反向代理



  • 1、先申请SSL证书:(假设域名是xxx.com

    检查80端口是否被占用,如果被占用,以下操作会失败

    git clone https://github.com/letsencrypt/letsencrypt
    cd letsencrypt
    ./letsencrypt-auto certonly --standalone --email admin@xxx.com -d xxx.com -d www.xxx.com -d bbs.xxx.com
    

    输入完以上指令后,然后一路确认,最后会在/etc/letsencrypt/live/xxx.com/下生成4个文件:

    • cert.pem - Apache服务器端证书
    • chain.pem - Apache根证书和中继证书
    • fullchain.pem - Nginx所需要ssl_certificate文件
    • privkey.pem - 安全证书KEY文件

    由于我使用的事Nginx,所以我只需要时候最后两个文件即可。

    2、配置nginx

    新增配置文件ssl.xxx.conf

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

    ssl.xxx.conf的内容如下:

    • server_name : 填写域名
    • ssl_certificate : ssl_certificate文件
    • ssl_certificate_key : privkey.pem
    • proxy_pass : 代理主机地址
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  bbs.xxx.bbs;
    
        ssl_certificate "/etc/letsencrypt/live/xxx.com/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/xxx.com/privkey.pem";
        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.
    
        location / {
          proxy_pass http://localhost:8081;
        }
    }
    

    然后重启nginx:systemctl restart nginx

    3、证书的有效期是90天,需要定期激活证书,下面是自动更新证书的脚本renew_certs.sh
    脚本需要可执行权限:chmod +x renew_certs.sh

    #!/bin/sh
    if ! ./letsencrypt/letsencrypt-auto renew --force-renewal > /var/log/letsencrypt/renew.log 2>&1 ; then
        echo Automated renewal failed:
        cat /var/log/letsencrypt/renew.log
        exit 1
    fi
    

    使用crontab创建定时任务:
    进入编辑状态:crontab -e
    新增:0 3 1 * * ~/renew_certs.sh
    这样设定后以后每月1号凌晨3点就会自动执行更新证书的脚本了。