Nginx HTTPS proxy 配置

4,358 阅读1分钟

背景

最近在开发一个全栈网页应用,用 React + Redux + Node + Express + MongoDB。在腾讯云租了个服务器,买了个域名,使用 Letsencrypt 注册了 SSL 证书。由于前端和后端在不同的端口上运行,需要在服务器上配置一个代理,转发前端的请求到后端上。

Nginx 配置

在 Basic Setting 附近加了一行,引入 proxy.conf 中的代理设置:

# /etc/ngxin/ngxin.conf

http {

    ##
    # Basic Settings
    ##

    include /etc/nginx/proxy.conf;

    # more stuff below...
}

代理设置

server {
    listen 443 ssl;
    server_name domain.com;
    ssl on;
    
    # 下面是 letsencrypt 证书的默认安装位置
    # 替换成自己的证书目录和域名
    ssl_certificate      /etc/letsencrypt/live/domain.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/domain.com/privkey.pem;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;
    
    # 前端请求转发至 80 端口
    location / {
        proxy_pass http://localhost:80;
    }
    
    # 前端发送的 domain/api/ 
    # 都会被转发到 http://localhost:4000
    location /api/ {
        proxy_pass http://localhost:4000;
        # 如下配置非必要
        # 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_set_header    X-Client-Verify  SUCCESS;
        # proxy_set_header    X-Client-DN      $ssl_client_s_dn;
        # proxy_set_header    X-SSL-Subject    $ssl_client_s_dn;
        # proxy_set_header    X-SSL-Issuer     $ssl_client_i_dn;
        # proxy_read_timeout 1800;
        # proxy_connect_timeout 1800;
    }
}

后端

proxy.conf 中设置了 /api/ 都转发到端口 4000,在后端路由配置中需要保证所有的 url 都是 /api/ 开头:

// app.js (或者 index.js,或者……)
// 一些代码

// 引入文件
var indexRouter = require('./routes/index')
var usersRouter = require('./routes/users')
var questionRouter = require('./routes/questions')

// 另一些代码

// 定义路由
app.use('/api', indexRouter)
app.use('/api/users', usersRouter)
app.use('/api/questions', questionRouter)