背景
最近在开发一个全栈网页应用,用 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)