Nginx部署项目经典问题
处理接口代理、单页应用刷新404等问题。
本文使用windows环境和解压版nginx。
接口代理
合理使用代理规避跨域。
打开conf下nginx.conf,向对应端口server里添加:
server {
listen 80;
# ...
# 代理/api的请求
location /api {
proxy_pass http://10.1.1.1:4592/api;
}
}
存在不同开头形式的接口,多添加location即可。
location参数使用~或~*为正则模式,~*代表不区分大小写
header转发
10.0.102.2服务器在可能会做一些记录,比如记录接口被访问时间、IP等,上面的配置就会发现,10.0.102.2服务器获取到的接口访问对象IP均是nginx所在服务器IP(内网IP)。
因为我们的代理过程是,客户端发起请求,nginx需要向代理服务器请求,10.0.102.2服务器接收到的信息是,nginx所在服务器在向他请求数据。
解决办法:使用nginx的proxy_set_header修改(添加)请求头
config
location /api {
proxy_pass http://127.0.0.1:4592/api;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
单页应用404
在vue-router使用history模式和react使用BrowserRouter时,刷新页面就会404,因为nginx(不只是这个软件会出现)并不知道路由地址指向的位置。
解决办法:向localtion项目配置项添加try_files uri uri/ /index.html;
config
location / {
alias D:/projects/xxx/;
# 指定主页
index index.html;
# 将uri转向首页
try_files $uri $uri/ /index.html;
}
多应用配置
在发布博客时,发现他把后台管理系统也给指向顶部首页了。
解决办法:(两个应用就配置两个location)
config
# 假设第二应用地址以second开头
location /second {
alias D:/projects/xxx/;
# 指定主页
index index.html;
# 将uri转向第二应用首页
try_files $uri $uri/ /second/index.html;
}
使用https
这里需要一个证书,这里使用免费的SSL证书,实在不行google下怎么生成假的吧。
Tomcat需要一个证书文件,然后在配置文件里配置秘钥,nginx需要两个文件,一个.crt证书,一个.key秘钥。
nginx.conf里已经有443端口号的配置了,直接取消注释,再再server里添加下面配置:
ssl on;
# 配置证书位置
ssl_certificate D:/ssl/nginx/do.com.crt;
# 配置秘钥位置
ssl_certificate_key D:/ssl/nginx/do.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
域名转发
# nps管理
server {
listen 80;
server_name ddd.do.com;
location / {
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name do.com;
rewrite ^(.*) https://$host$1 permanent; #请求重定向到https
}
反向代理502
setsebool -P httpd_can_network_connect 1