一.nginx反向代理配置一个域名映射到不同端口的项目

一个域名一般是绑定要一个端口,http默认是绑定80端口,https默认绑定443,如果我们直接使用服务器的域名端口发布服务的话,需要外网访问的项目都需要放到同一个web服务器下。

但是有些项目由于开发语言不同等等原因不能放在一个web服务器一起发布,都有外网域名访问的需求,使用nginx反向代理配置可以解决。

例如微信公众号的H5链接必须域名才能正常访问,我们可以使用把域名绑定的端口指向nginx服务器,其他端口的项目通过nginx映射即可。

首先下载nginx  我下载的是1.13.1版本 下载后找到 ..\nginx\nginx-1.13.1\conf\nginx.conf配置文件 修改配置

1.我直接把我的配置贴出来 大家参考

#================begin=========================

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  10;
 
    proxy_connect_timeout       10; 
   # proxy_read_timeout          1;
   # proxy_send_timeout          1;

    #gzip  on;


   server {
        listen       80; #这个nglnx监听的端口 
       server_name localhost;

        location /wsyyPlatform {  #wsyyPlatform为该tomcat发布的项目

            proxy_pass   http://127.0.0.1:8098;
        }

         location /wsyy { #wsyy为该tomcat发布的项目

            proxy_pass   http://127.0.0.1:8085;
        }
        
       
    }
    
}


#================end=========================

相信大家看一下 server的配置已经知道怎么配置了,


   

     location /wsyyPlatform {  #wsyyPlatform为该tomcat发布的项目

            proxy_pass   http://127.0.0.1:8098;
      }

要映射到的项目通过这几行配置搞定。。。

location的写法有几种

这种写法也行

location /wsyyPlatform/ {  #wsyyPlatform为该tomcat发布的项目

            proxy_pass   http://127.0.0.1:8098/wsyyPlatform/;
 }

二.使用中碰到的问题

1.我是java web项目,项目中有重定向的代码response.sendRedirect(url)

默认情况下重定向到ng配置的项目真实地址了

解决方法是ng配置文件增加

 proxy_set_header Host $http_host;

2.nginx默认的请求大小都有限制,默认是1M,上传文件超过1M是常有的,需要增加以下配置

client_max_body_size    3m; #最大接受3m文件以内的

配置可以设置为全局的,也可以每个location下单独指定

3.nginx配置代理后丢失端口号

 我这边在配置nginx代理nexus私服时,出现过该问题,配置如下

nginx端口号是8086

代理nuxus私服后加载js css资源 发现8086端口号丢失,导致加载资源失败

处理方法,增加配置

主要是proxy_set_header Host $host:$server_port;配置把nginx端口号携带过去

location /nexus/ {  
		proxy_set_header Host $host:$server_port;
		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://10.8.3.196:8081/nexus/;
	}

重新加载nginx配置文件,再次访问正常

4.nginx 504 (Gateway Time-out)

业务系统部分请求耗时很长,ajax和后台接口都调整了timeout超时时间为1小时,浏览器请求时发现该报错,排查是nginx默认超时时间60S

调整为1个小时,根据业务场景,可以针对某个location单独映射,也可以配置全局。

 location /wsyyPlatform/ {  
	    proxy_send_timeout 3600s;     # 设置发送超时时间,
	    proxy_read_timeout 3600s;	 # 设置读取超时时间。
            proxy_pass   http://127.0.0.1:7081/wsyyPlatform/;
	 }

 修改后nginx配置重启nginx,再次测试,5.7分都没超时 。不过这个都有利有弊,因为超时时间一小时意味着如果你的后台服务真的有问题,系统故障导致一直没返回,nginx没到超时时间还是会等待,这个对于项目调优严格的需要全面考虑,调整合适的。

5.nginx 502 (response设置到header头中cookie值太大导致的网关错误)

系统登录有“”记住我“”功能,勾选后登录成功后台response会往header头里写入cookie存储加密的用户认证字符串,字符串比较长,导致返回502了,以下是nginx日志找到的报错日志

2024/09/26 11:50:14 [error] 7105#0: *14732 upstream sent too big header while reading response header from upstream, client: xxx.50, server: xxxr.com, request: "POST /xxxManager/login HTTP/1.1", upstream: "http://xxxx:7065/xxxxxManager/login", host: "xxxx.com", referrer: "http://xxxxx.com/xxxxManager/login"

处理方法,增加nginx header头等内存配置

nginx server增加配置,

        client_header_buffer_size 128k;
        large_client_header_buffers 4 128k;
        proxy_buffer_size 64k;
        proxy_buffers 8 64k;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 128k;

下面是对这些nginx配置项的解释:

  • 1. `client_header_buffer_size 128k;`:该配置项设置接收客户端请求头的缓冲区大小。如果请求头超过128k的大小,nginx将返回"Request Header Too Large"错误。适当调整该值可以确保较大的请求头能够被处理。
  • 2. `large_client_header_buffers 4 128k;`:该配置项设置用于接收和存储大型客户端请求头的缓冲区数量和大小。默认情况下,nginx会使用2个缓冲区,每个大小为8k。如果请求头超过这些缓冲区的总容量,则nginx将返回"Request Header Too Large"错误。通过增加缓冲区数量和大小,可以处理较大的请求头。
  • 3. `proxy_buffer_size 64k;`:该配置项设置用于接收和存储代理服务器响应的缓冲区大小。如果代理响应超过64k的大小,nginx将发送数据并继续接收响应。适当调整该值可以确保较大的代理响应能够被处理。
  • 4. `proxy_buffers 8 64k;`:该配置项设置用于接收和存储代理服务器响应的缓冲区数量和大小。默认情况下,nginx会使用4个缓冲区,每个大小为8k。如果代理响应超过这些缓冲区的总容量,则nginx将发送数据并继续接收响应。通过增加缓冲区数量和大小,可以处理较大的代理响应。
  • 5. `fastcgi_buffer_size 128k;`:该配置项设置用于接收和存储FastCGI服务器响应的缓冲区大小。如果FastCGI响应超过128k的大小,nginx将发送数据并继续接收响应。适当调整该值可以确保较大的FastCGI响应能够被处理。
  • 6. `fastcgi_buffers 4 128k;`:该配置项设置用于接收和存储FastCGI服务器响应的缓冲区数量和大小。默认情况下,nginx会使用2个缓冲区,每个大小为8k。如果FastCGI响应超过这些缓冲区的总容量,则nginx将发送数据并继续接收响应。通过增加缓冲区数量和大小,可以处理较大的FastCGI响应。
  • 这些配置项的目的是优化nginx在处理大请求头、代理响应和FastCGI响应时的性能和稳定性。调整这些值要根据实际需求和服务器资源进行评估和测试。

6.nginx 代理域名地址 ,使用nginx地址访问代理的地址,提示不允许ip访问

因为很多域名设置了不允许ip访问,当我们使用nginx代理后,使用ng地址访问, 对方获取到的host是我们的ip地址,导致无法访问

解决方法: 增加 proxy_set_header Host设置,并且host写要代理的域名,

这样我们使用自己的ng的 ip访问时,对方收到的还是 szugzh.szu.edu.cn  host,就会放行了

	location /whs242/ {
	proxy_set_header Host szugzh.szu.edu.cn;
 
            proxy_pass   https://szugzh.szu.edu.cn/whs/;
	} 

三.window启动nginx  


cmd  G:
cd G:\workSoft\nginx\nginx-1.13.1
启动  

start nginx

停止

nginx.exe -s stop

重新载入conf配置文件

nginx.exe -s reload

1.提供几个bat脚本,放到nginx\nginx-1.13.1目录下即可,省的敲CMD

1.1 reload.bat

nginx -s reload
@echo reload nginx server...
cmd

1.1 startup.bat

start nginx
@echo start nginx server...
cmd

1.1 stop.bat

nginx.exe -s stop
@echo stop nginx service...
cmd

四.最后总结:

通用配置

 location /bsoftmecwx1/ {  
         client_max_body_size    30m; 
        proxy_set_header Host $host:$server_port;
        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://192.168.1.240:7082/bsoftmecwx1/;
     }

如果没有nginx我们必须把wsyyPlatform,wsyy放到一个容器下发布 ,如果2个程序开发语言不同放一个容器发布不了,

我这里服务器域名为wying.com.cn,通过nginx反向代理配置后我们通过浏览器

访问http://wying.com.cn/wsyyPlatform会自动映射到http://127.0.0.1:8098/wsyyPlatform;

访问http://wying.com.cn/wsyy会自动映射到http://127.0.0.1:8085/wsyy

这个只有服务器有一个域名 我们可以把程序部署在多个容器 只要映射好可以通过域名访问了

使用nginx代理 指定文件,如微信授权文件

http://ip:port/mj7tC5sXMJ.txt

location /mj7tC5sXMJ {
            root   authorizationFile;
            index  mj7tC5sXMJ.txt mj7tC5sXMJ.txt;
        }

使用nginx 重定向,如为网站社设置一个短路径,方便用户手输网站地址

访问 http://ip:port/xhyy/

会重定向到 return里配置的地址

# 苏州xxxx医院 PC报告查询短链接
	location /xhyy/ {  
 
           return   https://xxxx.com.cn/BsoftMECBGCX/szgyyqxhyyAction_index.do?jgid=YmZLYWNnU0YrWnBoaDhXOXFSVm50UT09;
	 } 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐