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

浙公网安备 33010602011771号