NGINX:获取原始IP与404页面配置

前往原站点查看

2023-10-25 10:38:34

    在昨天的博客(NGINX:端口映射子域名&维护页面切换)中,我们成功的将不同端口映射到指定的三级域名,并且实现了维护页面的基础切换,但是在后续的查询时,却发现了一个问题。

    我的博客浏览量是和用户访问IP直接关联的,然而在NGINX启用后,用不同的网络设备去浏览同一篇网站时,计数始终没有变更,初步怀疑是NGINX反向代理的锅。于是今天到服务器查看了redis的浏览量数据集,发现IP全是127.0.0.1,明显是本地回路地址。



   所以问题原因很明了了,解决措施就是在NGINX的server.location中设置代理的请求头,我这边使用的是通用的大家都在使用的写法。

location / {
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header REMOTE-HOST $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_pass http://dreamcenter;
}

    其次在springboot中获取ip时也不能再直接使用 request.getRemoteAddr() 来获取了,而要从请求头获取。

String realIp = request.getHeader("X-Real-IP");

    这样就能正确的获取IP了,博客的浏览量记录也恢复正常。



    然后是当主服务下线后,走后备backup服务时,因为我http-server服务没有指定404页面,导致如果访问路径不存在时,会显示浏览器默认的404页面。所以需要加配一个404页面以供访问异常时显示。最终的server配置如下所示。

server {
	listen       443 ssl;
	server_name  www.dreamcenter.top;

	ssl_certificate      C:\xxxxxxxx\ssl\dreamcenter.top_nginx\dreamcenter.top_bundle.crt;
	ssl_certificate_key  C:\xxxxxxxx\ssl\dreamcenter.top_nginx\dreamcenter.top.key;

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;
	
	ssl_protocols TLSv1.2 TLSv1.3; 

	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
	ssl_prefer_server_ciphers  on;

	location / {
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header REMOTE-HOST $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	
		proxy_pass http://dreamcenter;
	}
	
	error_page 404 /404.html;
	location = /404.html {
		root C:\xxxxxxxx\dreamcenter\维护页面;
		internal;
	}
}


上一篇: NGINX:端口映射子域名&维护页面切换
下一篇: Springboot的依赖包分离