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";