Nginx问题记录

Nginx配置

server {
        listen       666 ssl;
        server_name  www.abc.com;

        ssl_certificate      ..//ssl/shidian.crt;
        ssl_certificate_key  ..//ssl/server_unsecure.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
		
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://192.168.1.221:7000/;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
    }
  

  

问题1

   通过Nginx进行反向代理使用HTTPS代理HTTP,实现HTTPS协议访问部署的HTTP请求的java项目,但是java项目中request.getRequestURL()获取请求路径记录却是HTTP的。

例如:客户端请求地址为:https://www.abc.com/,项目中获取的请求路径为:http://www.abc.com/

解决办法:

  Nginx配置的location中添加

proxy_set_header X-Forwarded-Proto  $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  java项目中修改Tomcat配置(使用的Spring Boot 2.X版本,所以是内嵌的Tomcat)

@Configuration
public class TomcatConfig {
    @Bean
    public ServletWebServerFactory servletContainer(){
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        // 新建一个RemoteIpValve
        RemoteIpValve remoteIpValve = new RemoteIpValve();
        // 下面这里的值要与nginx的header头对应
        remoteIpValve.setRemoteIpHeader("x-forwarded-for");
        remoteIpValve.setProtocolHeader("x-forwarded-proto");
        // 为tomcat新增一个valve
        tomcat.addEngineValves(remoteIpValve);
        return tomcat;
    }
}

  

此时request.getRequestURL()获取到的就是HTTPS协议的请求地址

 

问题2

  request.getRequestURL()获取的请求地址是代理的地址不是用户真正的请求地址

例如:客户请求的地址:https://www.abc.com/ 项目获取的地址:https://192.168.1.221/

解决办法

  在nginx的location配置中添加

proxy_set_header Host $http_host;

  

此时就可以获取到请求的真正路径地址:https://www.abc.com

 

问题3

  获取的请求路径不含有真实路径中的请求端口,而是系统默认的 443 端口

例如:真实请求地址:https://www.abc.com:666/   获取的请求地址:https://www.abc.com/ ,获取的端口号:443

解决方法

  在nginx的location配置中添加

proxy_set_header X-Real-Port $server_port;

  在java项目中添加Tomcat配置

remoteIpValve.setPortHeader("x-real-port");

  

此时获取的请求地址中就会含有真正的端口号 666,https://www.abc.com:666/

 

问题4

  关闭Nginx后仍然能访问

解决办法

  关闭进程,有时候在任务管理器是找不到这个进程的,只能使用命令行进行关闭

步骤1,查询nginx进程

tasklist /fi "imagename eq nginx.exe"

 

这时,如果含有未关闭的进程会显示如下  

 

 

 

步骤2,关闭进程

  根据PID进行关闭进程

taskkill -t -f /pid PID的值

  例如:

taskkill -t -f /pid 230524

  此时会显示如下 

 

   这时候理应就关闭了Nginx进程了,如果还能访问则再重复执行1、2步骤,直至无法访问为止

 

问题5

  使用Nginx反向代理后,Websocket 请求连接失败。

 

 

解决办法

  在上述Nginx配置中的location (具体看个人情况)中添加配置

			proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";

  

posted @ 2022-09-05 09:42  假装空白  阅读(198)  评论(0)    收藏  举报