0

    nginx反向代理配置一个域名映射到不同端口的项目,nginx常见问题整理

    2023.07.15 | admin | 134次围观

    一.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没到超时时间还是会等待,这个对于项目调优严格的需要全面考虑,调整合适的。

    三.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 :7082/bsoftmecwx1/;

    }

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

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

    访问会自动映射到:8098/wsyyPlatform;

    访问会自动映射到:8085/wsyy

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

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论