nginx之配置文件公用抽取

nginx之配置文件公用抽取

因为某些原因,需要同时部署同一应用两个不同分支的代码,而配置文件存在较大重复,因此有此篇。

最近构建的过程中遇到了一些跟nginx配置相关的问题,记录下。

简单说下构建的状况:前后端分离,jenkins + jar包+nginx部署前端。

#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  '$upstream_addr $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  65;

    #gzip  on;

    # 服务器有限,暂且部署到当前服务器上
    upstream applicationName_server {
		ip_hash;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen       8888;
        server_name  localhost;
    	# 上传文件大小限制100M
    	client_max_body_size 100m;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
	    add_header BackendIP "$upstream_addr;" always;

    	set $ROOT_HTML /opt/soft/applicationName/backend/ui/html;

		location ^~/applicationName/login {
		    proxy_pass http://applicationName_server;
		    add_header 'Cache-Control' 'no-cache';
			proxy_set_header Host             $http_host;
			proxy_set_header X-Real-IP        $remote_addr;
			proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
       
		}
		location ^~/applicationName/logout {
		   proxy_pass http://applicationName_server;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		
		location /applicationName/api {
		   proxy_pass http://applicationName_server;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		location ^~/applicationName/cas {
		   proxy_pass http://applicationName_server;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		location /applicationName/artery {
		   proxy_pass http://applicationName_server;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}

		location /applicationName/artery/code {
		   proxy_pass http://applicationName_server/applicationName/code/;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}

        location ^~/static {
			root $ROOT_HTML/applicationName;
		}

		location / {
				root $ROOT_HTML;
				 rewrite ^ /applicationName break;	                         
		}
		location /applicationName {
			if ($http_cookie = "") {
					 add_header Set-Cookie "thguid=$request_id;Path=/;Max-Age=315360000" always;
					 rewrite ^ /index.html break;
				}
				root   $ROOT_HTML;
				index  index.html;
				try_files $uri $uri/ /index.html;		
    		
		}

		location ~* ^.+\.(ico|js|gif|jpg|jpeg|png)$ {
			root   $ROOT_HTML;
			try_files $uri $uri/ /index.html =404;
			expires 1d;
		}

		location ~* ^.+\.(eot|ttf|otf|woff|svg)$ {
			root   $ROOT_HTML;
			try_files $uri $uri/ /index.html =404;
			expires 7d;
		}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }
	
	server {
        listen       7777;
        server_name  localhost;
    	# 上传文件大小限制100M
    	client_max_body_size 100m;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
	    add_header BackendIP "$upstream_addr;" always;

    	set $ROOT_HTML /opt/soft/applicationName/backend/ui/otherhtml;

		location ^~/applicationName/login {
		    proxy_pass http://127.0.0.1:8087;
		    add_header 'Cache-Control' 'no-cache';
			proxy_set_header Host             $http_host;
			proxy_set_header X-Real-IP        $remote_addr;
			proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
       
		}
		location ^~/applicationName/logout {
		   proxy_pass http://127.0.0.1:8087;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		
		location /applicationName/api {
		   proxy_pass http://127.0.0.1:8087;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		location ^~/applicationName/cas {
		   proxy_pass http://127.0.0.1:8087;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}
		location /applicationName/artery {
		   proxy_pass http://127.0.0.1:8087;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}

		location /applicationName/artery/code {
		   proxy_pass http://127.0.0.1:8087/applicationName/code/;
		   add_header 'Cache-Control' 'no-cache';
		   proxy_set_header Host             $http_host;
		   proxy_set_header X-Real-IP        $remote_addr;
		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
		}

        location ^~/static {
			root $ROOT_HTML/applicationName;
		}

		location / {
				root $ROOT_HTML;
				 rewrite ^ /applicationName break;	                         
		}
		location /applicationName {
			if ($http_cookie = "") {
					 add_header Set-Cookie "thguid=$request_id;Path=/;Max-Age=315360000" always;
					 rewrite ^ /index.html break;
				}
				root   $ROOT_HTML;
				index  index.html;
				try_files $uri $uri/ /index.html;		
    		
		}

		location ~* ^.+\.(ico|js|gif|jpg|jpeg|png)$ {
			root   $ROOT_HTML;
			try_files $uri $uri/ /index.html =404;
			expires 1d;
		}

		location ~* ^.+\.(eot|ttf|otf|woff|svg)$ {
			root   $ROOT_HTML;
			try_files $uri $uri/ /index.html =404;
			expires 7d;
		}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }


    

}


刚开始的时候只监听了8888端口(后端端口8081,8082),用来构建dev分支代码。后来,需要构建出一个新的分支,又不能影响dev分支。因此新增一个7777端口进行监听(后端对应端口8087),两个server除了端口不同外就只有proxy_pass对应的地址不同,html的地址不同,因此,考虑将相同部分抽出来。

在conf同级新建conf.d文件夹,新建dev.conf和performance.conf

server {
        listen       8888;
        server_name  localhost;
        # 上传文件大小限制100M
        client_max_body_size 100m;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
            add_header BackendIP "$upstream_addr;" always;

        set $ROOT_HTML /opt/soft/applicationName/backend/ui/html;
        set $SERVER_URL applicationName_server;
        include common-route.conf;


    }

server {
        listen       7777;
        server_name  localhost;
        # 上传文件大小限制100M
        client_max_body_size 100m;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
            add_header BackendIP "$upstream_addr;" always;

        set $ROOT_HTML /opt/soft/applicationName/backend/ui/otherhtml;
        set $SERVER_URL 127.0.0.1:8087;
        include common-route.conf;



    }



这里将原本两个不同点通过设置ROOT_HTMLSERVER_URL来解决。其余的内容放到conf文件夹下的common-router.conf

# 通用路由
location ^~/applicationName/login {
                    proxy_pass http://$SERVER_URL;
                    add_header 'Cache-Control' 'no-cache';
                        proxy_set_header Host             $http_host;
                        proxy_set_header X-Real-IP        $remote_addr;
                        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;

                }
                location ^~/applicationName/logout {
                   proxy_pass http://$SERVER_URL;
                   add_header 'Cache-Control' 'no-cache';
                   proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }

                location /applicationName/api {
                   proxy_pass http://$SERVER_URL;
                   add_header 'Cache-Control' 'no-cache';
                   proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }
                location ^~/applicationName/cas {
                   proxy_pass http://$SERVER_URL;
                   add_header 'Cache-Control' 'no-cache';
                   proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }
                location /applicationName/artery {
                   proxy_pass http://$SERVER_URL;
                   add_header 'Cache-Control' 'no-cache';
                   proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }

                location /applicationName/artery/code {
                   #return 200 http://$SERVER_URL/applicationName/code;
                rewrite  ^/(.*)/code/(.*)$ /applicationName/code/$2  permanent;
                   #proxy_pass $CODE_URL;
                   #proxy_pass http://$SERVER_URL/applicationName/code/;
                   #proxy_pass http://127.0.0.1:8087/applicationName/code/;
                   add_header 'Cache-Control' 'no-cache';
                   proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }
                location /applicationName/code {
                   proxy_pass http://$SERVER_URL;
proxy_set_header Host             $http_host;
                   proxy_set_header X-Real-IP        $remote_addr;
                   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                }

        location ^~/static {
                        root $ROOT_HTML/applicationName;
                }

                location / {
                                root $ROOT_HTML;
                                 rewrite ^ /applicationName break;
                }
                location /applicationName {
                        if ($http_cookie = "") {
                                         add_header Set-Cookie "thguid=$request_id;Path=/;Max-Age=315360000" always;
                                         rewrite ^ /index.html break;
                                }
                                root   $ROOT_HTML;
                                index  index.html;
                                try_files $uri $uri/ /index.html;

                }

                location ~* ^.+\.(ico|js|gif|jpg|jpeg|png)$ {
                        root   $ROOT_HTML;
                        try_files $uri $uri/ /index.html =404;
                        expires 1d;
                }

                location ~* ^.+\.(eot|ttf|otf|woff|svg)$ {
                        root   $ROOT_HTML;
                        try_files $uri $uri/ /index.html =404;
                        expires 7d;
                }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

nginx.conf如下

#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  '$upstream_addr $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  65;

    #gzip  on;

    # 服务器有限,暂且部署到当前服务器上
    upstream applicationName_server {
                ip_hash;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }


    include /usr/local/nginx/conf.d/*.conf;



}

虽然上面的配置平平无奇,不过走向正确配置的道路还是遇到了些波折。

  • conf.d文件夹下的两个conf文件的include文件的路径问题,..啥的用不了,反倒是看起来不正确的 include common-route.conf;能够正确引用。另一点是,common-route.conf不能放到conf.d下面,报的错忘了什么了。

  • 原先conf.dconf文件的SERVER_URL是这样的http://applicationName_server,后来报了invalid port,把http://去掉放到具体的server里面了。

  • 单值代码加载,在未做改造前这样

    location /applicationName/artery/code {
    		   proxy_pass http://applicationName_server/applicationName/code/;
    		   add_header 'Cache-Control' 'no-cache';
    		   proxy_set_header Host             $http_host;
    		   proxy_set_header X-Real-IP        $remote_addr;
    		   proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
    		}
    

    第一次改造

    location /applicationName/artery/code {
                      
                      
    	proxy_pass http://$SERVER_URL/applicationName/code/;
    
        add_header 'Cache-Control' 'no-cache';
        proxy_set_header Host             $http_host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    

    这种直接404,而如果把$SERVER_URL改成具体的后端地址,则7777和8888端口中有一个可以正常访问单值代码。谷歌的几个方案都说是什么resolver的问题,但照着改还是不工作

    再后来改造使用rewrite来改写path

       location /applicationName/artery/code {
                       
                    rewrite  ^/(.*)/code/(.*)$ /applicationName/code/$2  permanent;
                       
                       add_header 'Cache-Control' 'no-cache';
                       proxy_set_header Host             $http_host;
                       proxy_set_header X-Real-IP        $remote_addr;
                       proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                    }
    

    路径倒是改了(忽略上面的$2,去掉第一个括号可以改成$1),可applicationName/code又404了。然后又加上了/applicationName/code的location配置

    location /applicationName/artery/code {
                       #return 200 http://$SERVER_URL/applicationName/code;
                    rewrite  ^/(.*)/code/(.*)$ /applicationName/code/$2  permanent;
                       #proxy_pass $CODE_URL;
                       #proxy_pass http://$SERVER_URL/applicationName/code/;
                       #proxy_pass http://127.0.0.1:8087/applicationName/code/;
                       add_header 'Cache-Control' 'no-cache';
                       proxy_set_header Host             $http_host;
                       proxy_set_header X-Real-IP        $remote_addr;
                       proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                    }
                    location /applicationName/code {
                       proxy_pass http://$SERVER_URL;
    proxy_set_header Host             $http_host;
                       proxy_set_header X-Real-IP        $remote_addr;
                       proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                    }
    

最后,附个conf的目录结构

posted @ 2021-12-11 10:15  Code&Fight  阅读(321)  评论(0编辑  收藏  举报