Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。 **官网对各个模块参数配置的解释说明网址:**[https://www.nginx.cn/doc/index.html](https://link.zhihu.com/?target=https%3A//www.nginx.cn/doc/index.html)[Nginx中文文档](https://link.zhihu.com/?target=https%3A//www.nginx.cn/doc/index.html) ## **Nginx特点** - 高并发、高性能; - 模块化架构使得它的扩展性非常好; - 异步非阻塞的事件驱动模型这点和 Node.js 相似; - 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性; - 热部署、平滑升级; - 完全开源,生态繁荣; ## **Nginx作用** Nginx 的最重要的几个使用场景: 1. 静态资源服务,通过本地文件系统提供服务; 2. 反向代理服务,延伸出包括缓存、负载均衡等; 3. API 服务, OpenResty ; 对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。 Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等), Node.js 更擅长上层具体业务逻辑的处理,两者可以完美组合。 用一张图表示:  ## **Nginx常用命令** ```Plain Text nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启 nginx -s reopen # 重启 Nginx nginx -s stop # 快速关闭 nginx -s quit # 等待工作进程处理完成后关闭 nginx -T # 查看当前 Nginx 最终的配置 nginx -t # 检查配置是否有问题 ``` ## **Nginx核心配置** ## **nginx.conf配置文件结构** Nginx 的典型配置示例: ```Plain Text # main段配置信息 user nginx; # 运行用户,默认即是nginx,可以不进行设置 worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样 error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录 pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置 # events段配置信息 events { use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的) worker_connections 1024; # 每个进程允许最大并发数 } # http段配置信息 # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置 http { # 设置日志模式 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 /var/log/nginx/access.log main; # Nginx访问日志存放位置 sendfile on; # 开启高效传输模式 tcp_nopush on; # 减少网络报文段的数量 tcp_nodelay on; keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒 types_hash_max_size 2048; include /etc/nginx/mime.types; # 文件扩展名与类型映射表 default_type application/octet-stream; # 默认文件类型 include /etc/nginx/conf.d/*.conf; # 加载子配置项 # server段配置信息 server { listen 80; # 配置监听的端口 server_name localhost; # 配置的域名 # location段配置信息 location / { root /usr/share/nginx/html; # 网站根目录 index index.html index.htm; # 默认首页文件 deny 172.168.22.11; # 禁止访问的ip地址,可以为all allow 172.168.33.44;# 允许访问的ip地址,可以为all } error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面 error_page 400 404 error.html; # 同上 } } ``` - main 全局配置,对全局生效; - events 配置影响 Nginx 服务器与用户的网络连接; - http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置; - server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块; - location 用于配置匹配的 uri ; - upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分; 用一张图清晰的展示它的层级结构:  nginx.conf 配置文件的语法规则: 1. 配置文件由指令与指令块构成 2. 每条指令以 “;” 分号结尾,指令与参数间以空格符号分隔 3. 指令块以 {} 大括号将多条指令组织在一起 4. include 语句允许组合多个配置文件以提升可维护性 5. 通过 # 符号添加注释,提高可读性 6. 通过 $ 符号使用变量 7. 部分指令的参数支持正则表达式,例如常用的 location 指令 ## **配置文件 main 段核心参数** ### **user** 指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。 ```Plain Text #语法:user USERNAME [GROUP] user nginx lion; # 用户是nginx;组是lion ``` ### **pid** 指定运行 Nginx master 主进程的 pid 文件存放路径。 ```Plain Text pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件 ``` ### **worker_rlimit_nofile_number** 指定worker子进程可以打开的最大文件句柄数。 ```Plain Text worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。 ``` ### **worker_rlimit_core** 指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。 ```Plain Text worker_rlimit_core 50M; # 存放大小限制 working_directory /opt/nginx/tmp; # 存放目录 ``` ### **worker_processes_number** 指定 Nginx 启动的 worker 子进程数量。 ```Plain Text worker_processes 4; # 指定具体子进程数量 worker_processes auto; # 与当前cpu物理核心数一致 ``` ### **worker_cpu_affinity** 将每个 worker 子进程与我们的 cpu 物理核心绑定。 ```Plain Text worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程 ```  将每个 worker 子进程与特定 CPU 物理核心绑定,优势在于,避免同一个 worker 子进程在不同的 CPU 核心上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。 ### **worker_priority** 指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。 ```Plain Text worker_priority -10; # 120-10=110,110就是最终的优先级 ``` Linux 默认进程的优先级值是120,值越小越优先; nice 值范围为 -20 到 +19 。 备注:应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。 ### **worker_shutdown_timeout** 指定 worker 子进程优雅退出时的超时时间。 ```Plain Text worker_shutdown_timeout 5s; ``` ### **timer_resolution** worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。 ```Plain Text timer_resolution 100ms; ``` 在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。 ### **daemon** 指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。 ```Plain Text daemon off; # 默认是on,后台运行模式 ``` ## **配置文件 events 段核心参数** ### **use** Nginx 使用何种事件驱动模型。 ```Plain Text use method; # 不推荐配置它,让nginx自己选择 ``` method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport ### **worker_connections** worker 子进程能够处理的最大并发连接数。 ```Plain Text worker_connections 1024 # 每个子进程的最大连接数为1024 ``` ### **accept_mutex** 是否打开负载均衡互斥锁。 ```Plain Text accept_mutex on # 默认是off关闭的,这里推荐打开 ``` ## **server_name 指令** 指定虚拟主机域名。 ```Plain Text #语法:server_name name1 name2 name3 # 示例: server_name www.nginx.com; ``` 域名匹配的四种写法: - 精确匹配: server_name [http://www.nginx.com](https://link.zhihu.com/?target=http%3A//www.nginx.com) ; - 左侧通配: server_name *.[http://nginx.com](https://link.zhihu.com/?target=http%3A//nginx.com) ; - 右侧统配: server_name www.nginx.* ; - 正则匹配: server_name ~^www\.nginx\.*$ ; 匹配优先级:**精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配** server_name 配置实例: 1、配置本地 DNS 解析 hosts ```Plain Text # 添加如下内容,其中 121.42.11.34 是阿里云服务器IP地址 121.42.11.34 www.nginx-test.com 121.42.11.34 mail.nginx-test.com 121.42.11.34 www.nginx-test.org 121.42.11.34 doc.nginx-test.com 121.42.11.34 www.nginx-test.cn 121.42.11.34 fe.nginx-test.club ``` 注意:这里使用的是虚拟域名进行测试,因此需要配置本地 DNS 解析,如果使用阿里云上购买的域名,则需要在阿里云上设置好域名解析。 2、配置阿里云Nginx,vim /etc/nginx/nginx.conf ```Plain Text # 这里只列举了http端中的sever端配置 # 左匹配 server { listen 80; server_name *.nginx-test.com; root /usr/share/nginx/html/nginx-test/left-match/; location / { index index.html; } } # 正则匹配 server { listen 80; server_name ~^.*\.nginx-test\..*$; root /usr/share/nginx/html/nginx-test/reg-match/; location / { index index.html; } } # 右匹配 server { listen 80; server_name www.nginx-test.*; root /usr/share/nginx/html/nginx-test/right-match/; location / { index index.html; } } # 完全匹配 server { listen 80; server_name www.nginx-test.com; root /usr/share/nginx/html/nginx-test/all-match/; location / { index index.html; } } ``` 3、访问分析 - 当访问 [http://www.nginx-test.com](https://link.zhihu.com/?target=http%3A//www.nginx-test.com) 时,都可以被匹配上,因此选择优先级最高的“完全匹配”; - 当访问 [http://mail.nginx-test.com](https://link.zhihu.com/?target=http%3A//mail.nginx-test.com) 时,会进行“左匹配”; - 当访问 [http://www.nginx-test.org](https://link.zhihu.com/?target=http%3A//www.nginx-test.org) 时,会进行“右匹配”; - 当访问 [http://doc.nginx-test.com](https://link.zhihu.com/?target=http%3A//doc.nginx-test.com) 时,会进行“左匹配”; - 当访问 [http://www.nginx-test.cn](https://link.zhihu.com/?target=http%3A//www.nginx-test.cn) 时,会进行“右匹配”; - 当访问 fe.nginx-test.club 时,会进行“正则匹配”; ## **root** 指定静态资源目录位置,它可以写在 http 、 server 、 location 等配置中。 ```Plain Text #root path #例如: location /image { root /opt/nginx/static; } #当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png ``` 注意:root 会将定义路径与 URI 叠加, alias 则只取定义路径。 ## **alias** 它也是指定静态资源目录位置,它只能写在 location 中。 ```Plain Text location /image { alias /opt/nginx/static/image/; } #当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png ``` 注意: 使用 alias 末尾一定要添加 / ,并且它只能位于 location 中。 ## **location** 配置路径。 ```Plain Text location [ = | ~ | ~* | ^~ ] uri { ... } ``` 匹配规则: - = 精确匹配; - ~ 正则匹配,区分大小写; - ~* 正则匹配,不区分大小写; - ^~ 匹配到即停止搜索; 匹配优先级: `=` > `^~` > `~` > `~*` > 不带任何字符。 实例: ```Plain Text server { listen 80; server_name www.nginx-test.com; # 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html location = /match_all/ { root /usr/share/nginx/html index index.html } # 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源 location ~ \.(jpeg|jpg|png|svg)$ { root /usr/share/nginx/images; } # 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html location ^~ /bbs/ { root /usr/share/nginx/html; index index.html index.htm; } } ``` ### **location 中的反斜线** ```Plain Text location /test { ... } location /test/ { ... } ``` - 不带 / 当访问 [http://www.nginx-test.com/test](https://link.zhihu.com/?target=http%3A//www.nginx-test.com/test) 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;如果没有 test 目录, nginx 则会找是否有 test 文件。 - 带 / 当访问 [http://www.nginx-test.com/test](https://link.zhihu.com/?target=http%3A//www.nginx-test.com/test) 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ,如果没有它也不会去找是否存在 test 文件。 ### **return** 停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。 ```Plain Text #return code [text]; #return code URL; #return URL; #例如: location / { return 404; # 直接返回状态码 } location / { return 404 "pages not found"; # 返回状态码 + 一段文本 } location / { return 302 /bbs ; # 返回状态码 + 重定向地址 } location / { return https://www.baidu.com ; # 返回重定向地址 } ``` ## **rewrite** 根据指定正则表达式匹配规则,重写 URL 。 ```Plain Text #语法:rewrite 正则表达式 要替换的内容 [flag]; #上下文(标签):server、location、if #示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用 ``` flag 可选值的含义: - last 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配; - break 直接使用重写后的 URL ,不再匹配其它 location 中语句; - redirect 返回302临时重定向; - permanent 返回301永久重定向; ```Plain Text server{ listen 80; server_name fe.lion.club; # 要在本地hosts文件进行配置 root html; location /search { rewrite ^/(.*) https://www.baidu.com redirect; } location /images { rewrite /images/(.*) /pics/$1; } location /pics { rewrite /pics/(.*) /photos/$1; } location /photos { } } ``` 按照这个配置我们来分析: - 当访问 fe.lion.club/search 时,会自动帮我们重定向到 [https://www.baidu.com](https://link.zhihu.com/?target=https%3A//www.baidu.com)。 - 当访问 fe.lion.club/images/1.jpg 时,第一步重写 URL 为 fe.lion.club/pics/1.jpg ,找到 pics 的 location ,继续重写 URL 为 fe.lion.club/photos/1.jpg ,找到 /photos 的 location 后,去 html/photos 目录下寻找 1.jpg 静态资源。 ## **if 指令** ```Plain Text #语法:if (condition) {...} #上下文:server、location #示例: if($http_user_agent ~ Chrome){ rewrite /(.*)/browser/$1 break; } ``` condition 判断条件: - $variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理; - = 或 != 相等或不等; - ~ 正则匹配; - ! ~ 非正则匹配; - ~* 正则匹配,不区分大小写; - -f 或 ! -f 检测文件存在或不存在; - -d 或 ! -d 检测目录存在或不存在; - -e 或 ! -e 检测文件、目录、符号链接等存在或不存在; - -x 或 ! -x 检测文件可以执行或不可执行; 实例: ```Plain Text server { listen 8080; server_name localhost; root html; location / { if ( $uri = "/images/" ){ rewrite (.*) /pics/ break; } } } ``` 当访问 localhost:8080/images/ 时,会进入 if 判断里面执行 rewrite 命令。 ## **autoindex** 用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。 autoindex.conf 配置信息: ```Plain Text server { listen 80; server_name fe.lion-test.club; location /download/ { root /opt/source; autoindex on; # 打开 autoindex,,可选参数有 on | off autoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩ autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间 } } ``` 当访问 [http://fe.lion.com/download/](https://link.zhihu.com/?target=http%3A//fe.lion.com/download/) 时,会把服务器 /opt/source/download/ 路径下的文件展示出来,如下图所示:  ## **Nginx内置变量** nginx 常用的内置全局变量,你可以在配置中随意使用:   实例演示: ```Plain Text server{ listen 8081; server_name var.lion-test.club; root /usr/share/nginx/html; location / { return 200 " remote_addr: $remote_addr remote_port: $remote_port server_addr: $server_addr server_port: $server_port server_protocol: $server_protocol binary_remote_addr: $binary_remote_addr connection: $connection uri: $uri request_uri: $request_uri scheme: $scheme request_method: $request_method request_length: $request_length args: $args arg_pid: $arg_pid is_args: $is_args query_string: $query_string host: $host http_user_agent: $http_user_agent http_referer: $http_referer http_via: $http_via request_time: $request_time https: $https request_filename: $request_filename document_root: $document_root "; } } ``` 当我们访问 [http://var.lion-test.club:8081/test?pid=121414&cid=sadasd](https://link.zhihu.com/?target=http%3A//var.lion-test.club%3A8081/test%3Fpid%3D121414%26cid%3Dsadasd) 时,由于 Nginx 中写了 return 方法,因此 chrome 浏览器会默认为我们下载一个文件,下面展示的就是下载的文件内容: ```Plain Text remote_addr: 27.16.220.84 remote_port: 56838 server_addr: 172.17.0.2 server_port: 8081 server_protocol: HTTP/1.1 binary_remote_addr: 茉 connection: 126 uri: /test/ request_uri: /test/?pid=121414&cid=sadasd scheme: http request_method: GET request_length: 518 args: pid=121414&cid=sadasd arg_pid: 121414 is_args: ? query_string: pid=121414&cid=sadasd host: var.lion-test.club http_user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 http_referer: http_via: request_time: 0.000 https: request_filename: /usr/share/nginx/html/test/ document_root: /usr/share/nginx/html ``` ## **Nginx常用配置**   ## **Nginx应用核心概念** 代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。 不管是正向代理还是反向代理,实现的都是上面的功能。  ## **正向代理** > 正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。 正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。 正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。 ## **反向代理** > 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。 反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为它服务。 反向代理的优势: - 隐藏真实服务器; - 负载均衡便于横向扩充后端动态服务; - 动静分离,提升系统健壮性; 那么“动静分离”是什么?负载均衡又是什么? ## **动静分离** 动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。  一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。 使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。 ## **负载均衡** 一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。 这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。 很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。 请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。 Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。 举个具体的例子,晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口, B 口人少车空....”,这个工作人员的作用就是负载均衡。  Nginx 实现负载均衡的策略: - 轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。 - 最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。 - 最快响应时间策略:优先分配给响应时间最短的服务器。 - 客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。 ## **Nginx实战配置** ## **upstream** 用于定义上游服务器(指的就是后台提供的应用服务器)的相关信息。  ```Plain Text 语法:upstream name { ... } 上下文:http 示例: upstream back_end_server{ server 192.168.100.33:8081 } ``` 在 upstream 内可使用的指令: - server 定义上游服务器地址; - zone 定义共享内存,用于跨 worker 子进程; - keepalive 对上游服务启用长连接; - keepalive_requests 一个长连接最多请求 HTTP 的个数; - keepalive_timeout 空闲情形下,一个长连接的超时时长; - hash 哈希负载均衡算法; - ip_hash 依据 IP 进行哈希计算的负载均衡算法; - least_conn 最少连接数负载均衡算法; - least_time 最短响应时间负载均衡算法; - random 随机负载均衡算法; ### **server** 定义上游服务器地址。 ```Plain Text 语法:server address [parameters] 上下文:upstream ``` parameters 可选值: - weight=number 权重值,默认为1; - max_conns=number 上游服务器的最大并发连接数; - fail_timeout=time 服务器不可用的判定时间; - max_fails=numer 服务器不可用的检查次数; - backup 备份服务器,仅当其他服务器都不可用时才会启用; - down 标记服务器长期不可用,离线维护; ### **keepalive** 限制每个 worker 子进程与上游服务器空闲长连接的最大数量。 ```Plain Text keepalive connections; 上下文:upstream 示例:keepalive 16; ``` ### **keepalive_requests** 单个长连接可以处理的最多 HTTP 请求个数。 ```Plain Text 语法:keepalive_requests number; 默认值:keepalive_requests 100; 上下文:upstream ``` ### **keepalive_timeout** 空闲长连接的最长保持时间。 ```Plain Text 语法:keepalive_timeout time; 默认值:keepalive_timeout 60s; 上下文:upstream ``` **【文章福利】:[C/C++Linux服务器开发/后台架构师【公开课学习】](https://link.zhihu.com/?target=https%3A//ke.qq.com/course/417774%3FflowToken%3D1043849)(C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)有需要的可以点击[793599096](https://link.zhihu.com/?target=https%3A//qm.qq.com/cgi-bin/qm/qr%3Fk%3DLgkDbnTyj6YB3JyvjFrCDKpe8SPkDIkO%26authKey%3DaPe4EghzEjEQ2vA08u5On4rkMm9jzgKm5qjkOlz2AhEbBPW2m0PpdyV9ReMp6Ud8%26noverify%3D0%26group_code%3D793599096)加群领取哦~**  ### **配置示例** ```Plain Text upstream back_end{ server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2; keepalive 32; keepalive_requests 50; keepalive_timeout 30s; } ``` ## **proxy_pass** 用于配置代理服务器。 ```Plain Text 语法:proxy_pass URL; 上下文:location、if、limit_except 示例: proxy_pass http://127.0.0.1:8081 proxy_pass http://127.0.0.1:8081/proxy ``` **URL 参数原则:** 1. URL 必须以 http 或 https 开头; 2. URL 中可以携带变量; 3. URL 中是否带 URI ,会直接影响发往上游请求的 URL ; 接下来让我们来看看两种常见的 URL 用法: 1. proxy_pass [http://192.168.100.33:8081](https://link.zhihu.com/?target=http%3A//192.168.100.33%3A8081) 2. proxy_pass [http://192.168.100.33:8081/](https://link.zhihu.com/?target=http%3A//192.168.100.33%3A8081/) 这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了: - 不带 / 意味着 Nginx 不会修改用户 URL ,而是直接透传给上游的应用服务器; - 带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除; **不带 / 的用法:** ```Plain Text location /bbs/{ proxy_pass http://127.0.0.1:8080; } ``` 分析: 1. 用户请求 URL:/bbs/abc/test.html 2. 请求到达 Nginx 的 URL:/bbs/abc/test.html 3. 请求到达上游应用服务器的 URL:/bbs/abc/test.html **带 / 的用法:** ```Plain Text location /bbs/{ proxy_pass http://127.0.0.1:8080/; } ``` 分析: 1. 用户请求 URL: /bbs/abc/test.html 2. 请求到达 Nginx 的 URL: /bbs/abc/test.html 3. 请求到达上游应用服务器的URL: /abc/test.html 并没有拼接上 /bbs ,这点和 root 与 alias 之间的区别是保持一致的。 ## **配置反向代理** 这里为了演示更加接近实际,作者准备了两台云服务器,它们的公网 IP 分别是:121.42.11.34 与 121.5.180.193 。 我们把 121.42.11.34 服务器作为上游服务器,做如下配置: ```Plain Text # /etc/nginx/conf.d/proxy.conf server{ listen 8080; server_name localhost; location /proxy/ { root /usr/share/nginx/html/proxy; index index.html; } } # /usr/share/nginx/html/proxy/index.html