Nginx部署项目经典问题

443#79883253

处理接口代理、单页应用刷新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

source

待补充...

参与本文讨论

请先登录 GitHub 后留言

0/500

本文留言

0

这篇文章还没有留言,来写第一条吧。

1 / 1