# Nginx 配置 - 反向代理 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎？为之，则难者亦易矣
Keywords: Nginx,反向代理

#### # 引言

- 所有配置方法和介绍均来至于网络搜索汇总，主要用于方便后期巩固学习。

#### # 何为反向代理

- 在介绍反向代理之前，先来了解一下正向代理。

正向代理：如果把局域网外的 Internet 想象成一个巨大的资源库，则局域网中的客户端要访问 Internet，则需要通过代理服务器来访问，这种代理服务就称为正向代理，下面是正向代理的原理图。
反向代理：看下面原理图，就一目了然。其实客户端对代理是无感知的，因为客户端不需要任何配置就可以访问，我们只需要将请求发送到反向代理服务器，由反向代理服务器去选择目标服务器获取数据后，在返回给客户端，此时反向代理服务器和目标服务器对外就是一个服务器，暴露的是代理服务器地址，隐藏了真实服务器 IP 地址。

> 正向代理和反向代理的区别，一句话就是：如果我们客户端自己用，就是正向代理。如果是在服务器用，用户无感知，就是反向代理。

#### # Nginx 配置文件

- 在学习 Nginx 之前，要熟知它的配置文件，毕竟，下面需要做的所有配置（反向代理、负载均衡、动静分离等），都是基于它的配置文件。

- Nginx 默认的配置文件是在安装目录下的 conf 目录下，后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。完整的配置文件，可以看一下文章最后。修改过 nginx.conf 配置文件，记得要✔️重启 Nginx 服务（☆☆☆☆☆）

- 配置文件中有很多 #号，该符号表示注释内容，去掉所有以 #开头的段落，精简之后的配置文件内容如下（PS：其实注释掉的地方，都是一些功能的使用代码，需要用到的时候，取消注释即可）：

    # 主进程叫 master，负责管理子进程，子进程叫 worker

    # worker_processes 配置项表示开启几个业务进程，一般和 cpu 核数有关

    worker_processes  1;

    events {

        worker_connections  1024;

    }

    http {

    	# include 表示可以引入其他文件，此处表示引入 http mime 类型

        include       mime.types;

        default_type  application/octet-stream;

        sendfile        on;

        keepalive_timeout  65;

    	# 虚拟主机，可以配置多个

        server {

            listen       80;

            server_name  localhost;

            location / {

            	# 路径匹配之后，哪个目录下去匹配相应的网页，html 是相对路径

                root   html;

                index  index.html index.htm;

            }

            error_page   500 502 503 504  /50x.html;

            location = /50x.html {

                root   html;

            }

    	}

    }

> 去掉注释信息后，可以将 nginx.conf 配置文件分为三部分：

1. 全局块

    worker_processes  1;

- 从配置文件开始到 events 块之间的内容，主要会设置一些影响 Nginx 服务器整体运行的配置指令，主要包括：配置运行 Nginx 服务器的用户（组）、允许生成的 worker process 数，进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

- 上面这行 worker_processes 配置，是 Nginx 服务器并发处理服务的关键配置，该值越大，可以支持的并发处理量也越多，但是会受到硬件、软件等设备的约束。

2. events 块

    events {

    	worker_connections  1024;

    }

- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接，常用的设置包括：是否开启对多 work process 下的网络连接进行序列化，是否允许同时接收多个网络连接，选取哪种事件驱动模型来处理连接请求，每个 work process 可以同时支持的最大连接数等

> 上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大，在实际中应该灵活配置。

3. http 块

    http {

        include       mime.types;

        default_type  application/octet-stream;

        sendfile        on;

        keepalive_timeout  65;

        server {

            listen       80;

            server_name  localhost;

            location / {

                root   html;

                index  index.html index.htm;

            }

            error_page   500 502 503 504  /50x.html;

            location = /50x.html {

                root   html;

        }

    }

- 这部分是 Nginx 服务器配置中最频繁的部分，代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是：http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置

http 全局块：http 全局块配置的指令包括：文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server 块：这块和虚拟主机有密切关系，从用户角度看，虚拟主机和一台独立的硬件主机是完全一样的，该技术的产生是为了节省互联网服务器硬件成本。

location 块：这块的主要作用是：基于 Nginx 服务器接收到的请求字符串（例如 server_name/uri-string），对虚拟主机名称（也可以是 IP 别名）之外的字符串（例如 前面的 /uri-string）进行匹配，对特定的请求进行处理。地址定向、数据缓存和应答控制等功能，还有许多第三方模块的配置也在这里进行。

每个 http 块可以包括多个 server 块，而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块，以及可以同时包含多个 locaton 块。（☆☆☆☆☆）

#### # 反向代理配置

1. location 配置规则

    location [ = | ~ | ~* | ^~ | @ ] /uri {

    }

    =    ：用于不含正则表达式的 uri 前，要求请求字符串与 uri 严格匹配，如果匹配成功，就停止继续向下搜索并立即处理该请求。

    ~    ：用于表示 uri 包含正则表达式，并且区分大小写。

    ~*   ：用于表示 uri 包含正则表达式，并且不区分大小写。

    ^~   ：用于不含正则表达式的 uri 前，要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的location后，立即使用此 location 处理请求，而不再使用 location 块中的正则 uri 和请求字符串做匹配。

    @    : "@" 定义一个命名的 location，使用在内部定向时，例如 error_page

    /uri  ：不带任何修饰符，也表示前缀匹配，但是在正则匹配之后，如果没有正则命中，命中最长的规则

    /    ：通用匹配，任何未匹配到其它location的请求都会匹配到，相当于switch中的default

uri 没有 “/” 结尾时，location /abc/def 可以匹配 /abc/defghi 请求，也可以匹配 /abc/def/ghi 等。
uri 有 “/” 结尾时，location /abc/def/ 不能匹配 /abc/defghi 请求，只能匹配 /abc/def/anything 这样的请求☆☆☆☆☆

2. proxy_pass 配置规则

url 结尾加上了 /，相当于是绝对路径，则 Nginx 不会把 location 中匹配的路径部分加入代理 url。
url 结尾不加 /，Nginx 则会把匹配的路径部分加入代理 uri。

    情景1:

    proxy_pass后有/

    访问地址：http://localhost:8081/WCP.Service/wcp/modeladapter/download/asc.shtml

    最终代理：http://10.194.171.7:13082/modeladapter/download/asc.shtml

    location /WCP.Service/wcp/modeladapter/download/ {

    	proxy_pass   http://10.194.171.7:13082/modeladapter/download/;

    }

    访问地址：http://localhost:8081/model/asc.shtml

    最终代理：http://127.0.0.1:8082/model/asc.shtml

    location /model/ {

    	proxy_pass   http://127.0.0.1:8082/model/;

    }

    情景2:

    proxy_pass后有/

    访问地址：http://localhost:8081/model/asc.shtml

    最终代理：http://127.0.0.1:8082/asc.shtml

    location /model/ {

    	proxy_pass   http://127.0.0.1:8082/;

    }

    情景3：

    proxy_pass后没有/

    访问地址：http://localhost:8081/model/asc.shtml

    最终代理：http://127.0.0.1:8082/model/asc.shtml

    location /model/ {

    	proxy_pass   http://127.0.0.1:8082;

    }

    情景4

    proxy_pass后没有/

    访问地址：http://localhost:8081/model/asc.shtml

    最终代理：http://127.0.0.1:8082/AAAmodel/asc.shtml

    location /model/ {

    	proxy_pass   http://127.0.0.1:8082/AAA;

    }

    情景5

    proxy_pass后有/

    访问地址：http://localhost:8081/model/asc.shtml

    最终代理：http://127.0.0.1:8082/asc.shtml

    location /model {

    	proxy_pass   http://127.0.0.1:8082/;

    }

    情景6

    proxy_pass后有/

    访问地址：http://localhost:8081/modelBBB/asc.shtml

    最终代理：http://127.0.0.1:8082/asc.shtml

    location /model {

    	proxy_pass   http://127.0.0.1:8082/;

    }

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

        server {

            listen       80;

            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {

                root   html;

                index  index.html index.htm;

            }

            #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;

            }

            # proxy the PHP scripts to Apache listening on 127.0.0.1:80

            #

            #location ~ \.php$ {

            #    proxy_pass   http://127.0.0.1;

            #}

            # 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;

            #}

            # 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 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 反向代理