Nginx+Egg.js配置Https
费了一下午终于把这个事搞定了,记录一下,也给有需要的小伙伴。
作为一个侧重前端的全栈,内心是很乐意用Node做后端的,也为有Eggjs这样的国产项目感到振奋。然而在看文档的时候又常常感到心里堵。
Nginx
在配置Https之前,我们的Nginx配置文件大概是这样的:
# /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.你的域名.com;
location / {
root html;
try_files $uri $uri/ @router; # 配置使用路由
index index.html index.htm;
}
}
}
关于证书的内容请另行搜索。假设你现在已经有了证书文件了,把它们放在服务器的某个文件夹中。然后来修改配置文件
# /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 这是新增的
server {
listen 443 ssl; # 这是新版本Nginx的写法,老的写法是listen 443; ssl on;
server_name www.你的域名.com;
# 这是两个证书文件的路径,改成自己的
ssl_certificate /usr/local/nginx/cert/9139200_isincerely.com.pem;
ssl_certificate_key /usr/local/nginx/cert/9139200_isincerely.com.key;
# 这些照抄
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 这是从原本listen 80的server剪切过来的
location / {
root html;
try_files $uri $uri/ @router; # 配置使用路由
index index.html index.htm;
}
# 这是新增的,为Egg写的
location /api/ {
proxy_pass http://127.0.0.1:7001/;
}
server {
listen 80;
server_name www.你的域名.com;
# 强制转到https
return 301 https://$server_name$request_uri;
}
}
这里要注意的就是这段
location /api/ {
proxy_pass http://127.0.0.1:7001/;
}
一般的Nginx配置https教程里没有这一段,就导致无法正确请求到Egg的接口。
Egg
配置完前面的内容,再把前端的请求、后端的跨域配置改成https,这样你的页面应该可以用https打开但是会发现请求报错了。
原来还需要在Egg的配置文件里加这段代码
// egg/config/config.default.js
const path = require("path");
module.exports = appInfo => {
...
config.cluster = {
https: {
key: path.join(__dirname,'../app/cert/证书.key'), // https 证书绝对目录
cert: path.join(__dirname,'../app/cert/证书.pem') // https 证书绝对目录
}
};
...
}
我不知道这段代码在文档的哪个位置,反正在文档里搜https或者ssl,都没有找到有用的内容。
另外有帖子说需要在Egg配置文件里加上
exports.proxy = true;
我没有加也没报错。
最后就是记得把前后端的代码中所有的http都改成https。