nginx做为一款优秀的反向代理软件,最常见的架构是:

客户 <---> NGINX(反向代理) <---> 后端服务器(upstream servers)

如果nginx和后端服务器都在公网上,按常规配置,nginx与后端服务器之间的流量是明文传输的,很容易受到篡改、嗅探或者被GFW认证。我就遇到了NGINX反代后端服务器时,竟然被劫持了!!!
Nginx作为工作在7层的软件,最常用的加密方式就是https了,我只需要加密nginx到upstream servers之间的流量,不需要浏览器认证,所以自签名证书就够了,此作法需要:

1. 自签名证书
2. 后端服务器配置https
3. nginx配置解密私钥

一、生成自签名证书
使用openssl生成签名证书:

openssl  req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout 52os.net.key -out 52os.net.crt

二、后端服务器配置自签名证书
为了不影响后端的https配置,我启用了一个新端口,配置自签名证书。我后端(upstream servers)也是nginx服务器

server {
    listen     12345;

    ssl on;
    ssl_certificate        "/etc/ssl/certs/52os.net.crt";
    ssl_certificate_key    "/etc/ssl/certs/52os.net.key";

    ...... server configs ......

}

三、NGINX配置upstream加密
nginx(反向代理)配置upstream和解密私钥:

upstream backend {
    server backend1.52os.net.com:12345;
    server 8.8.8.8:12345;
    check interval=3000 rise=2 fall=3 timeout=30000 type=tcp;
    #check interval=3000 rise=2 fall=3 timeout=30000 type=http;
    #check_http_send "GET / HTTP/1.0\r\nConnection: keep-alive\r\nHost:www.52os.net\r\n\r\n";
    #check_http_expect_alive http_2xx http_3xx;

   }

server {
    listen     80;

    ssl_certificate_key    "/etc/ssl/certs/52os.net.key";

    location / {
        proxy_redirect         off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass https://backend;
    }
}

配置好后,nginx到后端的upstream servers就会使用https加密了。
我的NIGNX版本tengine 2.1.2(nginx 1.6.1),nginx版本非常低。如果使用的是官方nginx,版本在1.9.2以上,有另外的模块可以实现Upstream加密的功能,原理是一样的。可以参考官方文章:https://www.nginx.com/resources/admin-guide/nginx-tcp-ssl-upstreams/