Nginx配置方向代理及目录白名单配置

目录

1、Nginx反向代理配置

2、目录白名单配置


1、Nginx反向代理配置

nginx 默认的配置文件是nginx.conf,进入nginx配置文件目录下打开配置文件

刚安装完的nginx.conf配置内容如下:

#user  nobody;
worker_processes  1;             #配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍于CPU数量

#error_log  logs/error.log;       #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;             #指定nginx进程运行文件存放地址
events {
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;        #文件扩展名与文件类型映射表
    default_type  application/octet-stream;    #默认文件类型,默认为text/plain

   #配置日志格式

    #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;    #配置access.log日志及存放路径,并且使用上面定义的main日志格式

    sendfile        on;    #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    #tcp_nopush     on;  #防止网络阻塞

    #keepalive_timeout  0;
    keepalive_timeout  65;   #连接超时时间,默认为75s,可以在http,server,location块。

    #gzip  on;    #是否开启gzip压缩输出

    #以下是配置跨域(Nginx设置响应头信息给浏览器)

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type;

    server {               #服务,可以有多个server,对应多个服务
        listen       80;  #监听端口 ,此项如果不配置则默认80端口
        server_name  localhost;  #配置服务名

        #charset koi8-r;   #配置字符集

        #access_log  logs/host.access.log  main;    #配置本虚拟主机的访问日志

      #默认的匹配斜杠/的请求,当访问路径有斜杠,会被该location匹配并且进行处理

        location / {
            root   html;  #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            index  index.html index.htm;  #配置首页文件的名称
        }

        #error_page  404              /404.html;  #配置404页面

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

       #PHP 脚本请求全部转发到Apache处理

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

      #PHP 脚本请求全部转发到FastCGI处理

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

       #禁止访问.htaccess 文件

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    #配置另外一台虚拟主机
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

   #配置https服务
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
 

nginx 文件结构说明:

Nginx的核心配置文件主要由三个部分构成:
1)基本配置(全局模块)
2)events配置
3)http配置
        http{}模块包含server{}块和location{}块;而server{}块又包含location{}块。

1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:
直接隶属于http{}块内的配置项称为main配置项
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如连接超时时间,单连接请求数等。
4、server块:
直接隶属于server{}块内的配置项称为srv配置项
配置虚拟主机的相关参数,一个http中可以有多个server,可以有多个server,对应多个服务。
5、location块:
直接隶属于location{}块内的配置项称为loc配置项
配置请求的路由,以及各种页面的处理情况。

配置例子:

#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 {undefined
    worker_connections  1024;  #最大连接数,默认为512
}
 
http {undefined
    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  65; #连接超时时间,默认为75s,可以在http,server,location块。
 
    #gzip  on;
    //以下是负载均衡配置包含多个配置项,主要有backup,weight,down,max_fails,fail_timeout..  proxy_next_upstream,
    如:upstream:www.aaaaa.com{}指定了三个服务器,其中8082端口服务器因为带有backup标识,作为备用服务器存在,也就是说当8081服务器正常时,8082服务器是不参与工作的,仅当8081服务器遇到了proxy_next_upstream指定的错误类型( error | timeout | http_502 | http_503 | http_504),nginx才会切换到备用服务器。
    weight:        #指定了服务器的权重, 其中8080服务器的流量将会是8081服务器的2倍。
    max_fails:   #允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
    fail_timeout:# 默认值10s,代表超时时间。
    down:            #表示当前的server暂时不参与负载
    ip_hash:     #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题,如果后端服务器down掉,要手工down掉。
    upstream www.aaaaa.com {  
            server 127.0.0.1:8080; weight=2 max_fails=3  fail_timeout=30s;
            server 127.0.0.1:8081 weight=1 max_fails=3  fail_timeout=30s;
            server 127.0.0.1:8082 weight=1  max_fails=3  fail_timeout=30s backup;
        
    }  
   
    upstream www.bbbbb.net {
            server 127.0.0.1:9999;
    }
 
    upstream www.ccccc.cn {  
            server 127.0.0.1:8888;
    }
    
    upstream weixin.ddddd.com {  
            server 127.0.0.1:8080;
    }
    
    upstream weixin.eeeee.com {  
            server 127.0.0.1:8899;
    }
    
    upstream 105.26.224.50 {  
            server 127.0.0.1:8899;
    }
    upstream 105.26.224.52 {  
            server 127.0.0.1:8899;
    }
    
    upstream demo.wly.fffff.com {  
            server 127.0.0.1:7777;
    }
    //以下是多站点多应用配置,各自有不同的域名,www.aaaaa.com将被自动代理到http://www.aaabb.com:8080服务器上, 而www.bbbbb.net:8081则被自动代理到http://www.bbbcc.net:8082服务器上。
    域名情况下,proxy_name,upstream
    server {
        listen       80;
        server_name  www.aaaaa.com;  
        charset utf-8;  #编码格式
        
        #location是nginx配置文件中的一个配置项, 当需要在一个域名下面部署多个不同服务器,可使用该方案,配置如下
        # http://www.aaaaa.com:80/mail/ 下的请求转发到 http://www.wly.com:80/protmail/
        location /mail/ {
            index  index.html index.jsp;
            proxy_pass http://www.wly.com:80/protmail/;   #指定要代理的服务器
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m;
        }
        # http://www.aaaaa.com:80/mail/ 下的请求转发到 http://www.wly.com:80/protmail/mail/
        location /com/ {
            index  index.html index.jsp;
            proxy_pass http://www.wly.com:80/protmail/mail/;
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m;
        }
        # 将其它所有请求转发到 http://www.aaabb.com:8080
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://www.aaabb.com:8080;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
            
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
 
    server {
        listen       80;
        server_name  www.bbbbb.net;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://www.bbbcc.net;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       80;
        server_name  www.ccccc.cn;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://www.ccccc.cn:8081;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       8082;
        server_name  weixin.ddddd.com;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://weixin.ddddd.com:8083;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       80;
        server_name  weixin.eeeee.com;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://weixin.eeeee.com;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       80;
        server_name  demo.wly.fffff.com;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://demo.wly.fffff.com;    
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  105.26.224.50;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://105.26.224.51;   
            proxy_set_header    Host 105.26.224.50;               
            proxy_set_header    X-Real-IP   $remote_addr;    
            client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  105.26.224.52;
 
        location / {
            index  index.html index.jsp;    
            proxy_pass  http://105.26.224.53; 
            proxy_set_header    Host 105.26.224.52;        #这一行的作用是把原http请求的Header中的Host字段也放到转发的请求,如果不加nginx转发的请求header里就不会有Host字段     
            proxy_set_header    X-Real-IP   $remote_addr;   # 在web服务器端获得用户的真实ip
           以下两行是nginx反向代理配置websocket
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection upgrade;
           以下三行是nginx设置超时配置
           proxy_connect_timeout 75; 链接
           proxy_read_timeout 600; 读取
           proxy_send_timeout 600; 发请求
          以下一行配置是客户端请求服务器最大允许大小
          client_max_body_size 4098m
          设置HTTP协议版本
          proxy_http_version 1.1
          proxy_cookie_domain参数的作用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性,如果set-cookie本身就没有domain内容则无需加
         proxy_cookie_domain 10.23.1.1 10.23.1.2;

         client_max_body_size    100m; 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    配置https请求
    server {
        listen 443;
        server_name localhost;   #本机的IP地址
        ssl on;
        root html;
        index index.html index.htm;
        ssl_certificate   cert/证书名称.pem; 如:/etc/nginx/server.crt;
        ssl_certificate_key  cert/证书名称.key; 如:/etc/nginx/server.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            #root   html;
            #index  testssl.html index.html index.htm;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://IP地址/ssl/;
        }
    }
}

其他常用配置

配置1:

location /test/ {
    proxy_pass http://10.23.2.96:8082/;
}

访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/login

配置2:

location /test {
    proxy_pass http://10.23.2.96:8082;
}

访问:http://127.0.0.1/test            转发到:http://10.23.2.96:8082/test
访问: http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/test/
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/test/login

配置3:

location /test{
    proxy_pass http://10.23.2.96:8082/define;
}

访问:http://127.0.0.1/test           转发到:http://10.23.2.96:8082/define
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/define/login

配置4:

location /test/ {
    proxy_pass http://10.23.2.96:8082;
}

访问:http://127.0.0.1/test           转发到:http://192.168.2.96:8082/test/
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/test/
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/test/login

配置5:

location /test/ {
    proxy_pass http://10.23.2.96:8082/define;
}

访问:http://127.0.0.1/test           转发到:http://192.168.2.96:8082/test/
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/define
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/definelogin  #define与login之间不会有/ ,会直接拼接起来

配置6:

location /test{
    proxy_pass http://10.23.2.96:8082/;
}

访问:http://127.0.0.1/test           转发到:http://10.23.2.96:8082/
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082//
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082//login

配置7:

location /test {
    proxy_pass http://10.23.2.96:8082/define/;
}

访问:http://127.0.0.1/test           转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/define//
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/define//login

配置8:

location /test/ {
    proxy_pass http://10.23.2.96:8082/define/;
}

访问:http://127.0.0.1/test           转发到:http://127.0.0.1:8082/test/
访问:http://127.0.0.1/test/          转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/login   转发到:http://10.23.2.96:8082/define/login

备注:proxy_pass 后的URL如果符合 protocol://ip:port 同时结尾不加"/",则nginx会代理匹配路径部分,否则不代理匹配路径,同时自动添加不匹配路径"部分",比如/testone/login的/login部分

2、目录白名单配置

配置1:校验一级目录

nginx.conf配置如下:

server {
    #配置校验一级路由白名单样例
    location /{
            set $urlacl $uri;
            if($urlacl ~ ^(/\w*).*)
            {
                set $urlacl /nginx/nginx/nginx/urlacl$1;
            }
            if(!-d $urlacl)
            {
                return 401;
            }
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://21.13.245.185:8090;  (转发地址)

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            expires -l;
        }
    }

对应目录配置如下:

 访问:http://xxx.xxx.xx.xx:8443/reader/open 无法转发到:http://21.13.245.185:8090/reader/open

访问:http://xxx.xxx.xx.xx:8443/reader           无法转发到:http://21.13.245.185:8090/reader

 访问:http://xxx.xxx.xx.xx:8443/minio/open   转发到:http://21.13.245.185:8090/minio/open

访问:http://xxx.xxx.xx.xx:8443/minio             转发到:http://21.13.245.185:8090/minio

配置1:校验二级目录

nginx.conf配置如下:

server {
    #配置校验二级路由白名单样例
    location /minio{
            set $urlacl $uri;
            if($urlacl ~ ^(/minio\w*).*)
            {
                set $urlacl /nginx/nginx/nginx/urlacl$1;
            }
            if(!-d $urlacl)
            {
                return 401;
            }
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass  http://wly.test.com:8090/wps_result/open;  (转发地址)

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            expires -l;
        }
    }

对应目录配置如下:

访问:http://127.0.0.1:8080/minio/test              无法转发到:http://wly.test.com:8090/wps_result/open/minio/test
访问:http://127.0.0.1:8080/minio/test/aa          无法转发到:http://wly.test.com:8090/wps_result/open/minio/test/aa
访问:http://127.0.0.1:8080/minio/adapter          转发到:http://wly.test.com:8090/wps_result/open/minio/adapter
访问:http://127.0.0.1:8080/minio/adapter/aa      转发到:http://wly.test.com:8090/wps_result/open/minio/adapter/aa

猜你喜欢

转载自blog.csdn.net/huanglm_OneWholeLife/article/details/122933369
今日推荐