☀️全网唯一万字长文讲解Nginx安装运营维护☀️《❤️记得收藏❤️》_目前全网唯一&2万字长文

69 阅读15分钟

/etc/rc.local是/etc/rc.d/rc.local的软连接,

chmod +x /etc/rc.d/rc.local


官方脚本 [ed Hat NGINX Init Script]( )。



### 🏞️4、运维



#### 🏟️4.1、服务管理



启动

/usr/local/nginx/sbin/nginx

重启

/usr/local/nginx/sbin/nginx -s reload

关闭进程

/usr/local/nginx/sbin/nginx -s stop

平滑关闭nginx

/usr/local/nginx/sbin/nginx -s quit

查看nginx的安装状态,

/usr/local/nginx/sbin/nginx -V


 关闭防火墙,或者添加防火墙规则就可以测试了 



service iptables stop


 或者编辑配置文件: 



vi /etc/sysconfig/iptables


 添加这样一条开放 80 端口的规则后保存: 



-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT


 重启服务即可: 



service iptables restart

命令进行查看目前nat

iptables -t nat -L


 重启服务防火墙报错解决 



service iptables restart

Redirecting to /bin/systemctl restart iptables.service

Failed to restart iptables.service: Unit iptables.service failed to load: No such file or directory.


 在 CentOS 7 或 RHEL 7 或 Fedora 中防火墙由 firewalld 来管理,当然你可以还原传统的管理方式。或则使用新的命令进行管理。 假如采用传统请执行一下命令: 



传统命令

systemctl stop firewalld systemctl mask firewalld

安装命令

yum install iptables-services

systemctl enable iptables service iptables restart


#### 🏛️4.1、nginx卸载


 如果通过 yum 安装,使用下面命令安装。 



yum remove nginx


 编译安装,删除 `/usr/local/nginx` 目录即可 如果配置了自启动脚本,也需要删除。。 


#### 🏗️4.2、参数说明




| 参数 | 说明 |
| --- | --- |
| –prefix=`<path>` | Nginx 安装路径。如果没有指定,默认为 `/usr/local/nginx`。 |
| –sbin-path=`<path>` | Nginx 可执行文件安装路径。只能安装时指定,如果没有指定,默认为`<prefix>/sbin/nginx`。 |
| –conf-path=`<path>` | 在没有给定 -c 选项下默认的`nginx.con`f的路径。如果没有指定,默认为`<prefix>/conf/nginx.conf`。 |
| –pid-path=`<path>` | 在 nginx.conf 中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 /logs/nginx.pid。 |
| –lock-path=`<path>` | nginx.lock 文件的路径。 |
| –error-log-path=`<path>` | 在 nginx.conf 中没有指定error\_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 `<prefix>/- logs/error.log`。 |
| –http-log-path=`<path>` | 在 nginx.conf 中没有指定access\_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 `<prefix>/- logs/access.log`。 |
| –user=`<user>` | 在 nginx.conf 中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 `nobody`。 |
| –group=`<group>` | 在 `nginx.conf` 中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 `nobody`。 |
| –builddir=DIR | 指定编译的目录 |
| –with-rtsig\_module | 启用 `rtsig` 模块 |
| –with-select\_module –without-select\_module | 允许或不允许`开启SELECT模式`,如果 `configure 没`有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+), rtsig(- 实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) `SELECT模式`将是`默认安装模式` |
| –with-poll\_module –without-poll\_module | Whether or not to enable the poll module. This module is enabled by, default if a more suitable method such as kqueue, epoll, rtsig or /dev/poll is not discovered by configure. |
| –with-http\_ssl\_module | Enable ngx\_http\_ssl\_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian, this is libssl-dev. 开启HTTP SSL模块,使NGINX可以`支持HTTPS请求`。这个模块需要已经`安装了OPENSSL`,在DEBIAN上是`libss`l |
| –with-http\_realip\_module | 启用 ngx\_http\_realip\_module |
| –with-http\_addition\_module | 启用 ngx\_http\_addition\_module |
| –with-http\_sub\_module | 启用 ngx\_http\_sub\_module |
| –with-http\_dav\_module | 启用 ngx\_http\_dav\_module |
| –with-http\_flv\_module | 启用 ngx\_http\_flv\_module |
| –with-http\_stub\_status\_module | 启用 “server status” 页 |
| –without-http\_charset\_module | 禁用 ngx\_http\_charset\_module |
| –without-http\_gzip\_module | 禁用 ngx\_http\_gzip\_module. 如果启用,需要 zlib 。 |
| –without-http\_ssi\_module | 禁用 ngx\_http\_ssi\_module |
| –without-http\_userid\_module | 禁用 ngx\_http\_userid\_module |
| –without-http\_access\_module | 禁用 ngx\_http\_access\_module |
| –without-http\_auth\_basic\_module | 禁用 ngx\_http\_auth\_basic\_module |
| –without-http\_autoindex\_module | 禁用 ngx\_http\_autoindex\_module |
| –without-http\_geo\_module | 禁用 ngx\_http\_geo\_module |
| –without-http\_map\_module | 禁用 ngx\_http\_map\_module |
| –without-http\_referer\_module | 禁用 ngx\_http\_referer\_module |
| –without-http\_rewrite\_module | 禁用 ngx\_http\_rewrite\_module. 如果启用需要 PCRE 。 |
| –without-http\_proxy\_module | 禁用 ngx\_http\_proxy\_module |
| –without-http\_fastcgi\_module | 禁用 ngx\_http\_fastcgi\_module |
| –without-http\_memcached\_module | 禁用 ngx\_http\_memcached\_module |
| –without-http\_limit\_zone\_module | 禁用 ngx\_http\_limit\_zone\_module |
| –without-http\_empty\_gif\_module | 禁用 ngx\_http\_empty\_gif\_module |
| –without-http\_browser\_module | 禁用 ngx\_http\_browser\_module |
| –without-http\_upstream\_ip\_hash\_module | 禁用 ngx\_http\_upstream\_ip\_hash\_module |
| –with-http\_perl\_module | 启用 ngx\_http\_perl\_module |
| –with-perl\_modules\_path=PATH | 指定 perl 模块的路径 |
| –with-perl=PATH | 指定 perl 执行文件的路径 |
| –http-log-path=PATH | Set path to the http access log |
| –http-client-body-temp-path=PATH | Set path to the http client request body temporary files |
| –http-proxy-temp-path=PATH | Set path to the http proxy temporary files |
| –http-fastcgi-temp-path=PATH | Set path to the http fastcgi temporary files |
| –without-http | 禁用 HTTP server |
| –with-mail | 启用 IMAP4/POP3/SMTP 代理模块 |
| –with-mail\_ssl\_module | 启用 ngx\_mail\_ssl\_module |
| –with-cc=PATH | 指定 C 编译器的路径 |
| –with-cpp=PATH | 指定 C 预处理器的路径 |
| –with-cc-opt=OPTIONS | Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD, it is necessary to indicate –with-cc-opt=”-I /usr/local/include”. If we are using select() and it is necessary to increase the number of file descriptors, then this also can be assigned here: –with-cc-opt=”-D FD\_SETSIZE=2048″. |
| –with-ld-opt=OPTIONS | Additional parameters passed to the linker. With the use of the system library PCRE in – FreeBSD, it is necessary to indicate –with-ld-opt=”-L /usr/local/lib”. |
| –with-cpu-opt=CPU | 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 |
| –without-pcre | 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也需要 PCRE 。 |
| –with-pcre=DIR | 指定 PCRE 库的源代码的路径。 |
| –with-pcre-opt=OPTIONS | Set additional options for PCRE building. |
| –with-md5=DIR | Set path to md5 library sources. |
| –with-md5-opt=OPTIONS | Set additional options for md5 building. |
| –with-md5-asm | Use md5 assembler sources. |
| –with-sha1=DIR | Set path to sha1 library sources. |
| –with-sha1-opt=OPTIONS | Set additional options for sha1 building. |
| –with-sha1-asm | Use sha1 assembler sources. |
| –with-zlib=DIR | Set path to zlib library sources. |
| –with-zlib-opt=OPTIONS | Set additional options for zlib building. |
| –with-zlib-asm=CPU | Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro |
| –with-openssl=DIR | Set path to OpenSSL library sources |
| –with-openssl-opt=OPTIONS | Set additional options for OpenSSL building |
| –with-debug | 启用调试日志 |
| –add-module=PATH | Add in a third-party module found in directory PATH |


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/aa1a1014b7fa4e2f9cf690761dd2ab38~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1773552046&x-signature=7iM8PrHnag5NRiSvRUEgPL4YSKw%3D)  
  **不管做什么,气质不可以输** 


### 🏘️5、配置


在Centos 默认配置文件在 `/usr/local/nginx-1.5.1/conf/nginx.conf` 我们要在这里配置一些文件。nginx.conf是主配置文件,由若干个部分组成,每个大括号{}表示一个部分。每一行指令都由分号结束,标志着一行的结束。


#### 🏚️5.1、常用正则




| `正则` | 说明 | `正则` | 说明 |
| --- | --- | --- | --- |
| `.` | 匹配除换行符以外的任意字符 | `$` | 匹配字符串的结束 |
| `?` | 重复0次或1次 | `{n}` | 重复n次 |
| `+` | 重复1次或更多次 | `{n,}` | 重复n次或更多次 |
| `*` | 重复0次或更多次 | `[c]` | 匹配单个字符c |
| `\d` | 匹配数字 | `[a-z]` | 匹配a-z小写字母的任意一个 |
| `^` | 匹配字符串的开始 | – | – |


#### 🏠5.2、全局变量




| 变量 | 说明 | 变量 | 说明 |
| --- | --- | --- | --- |
| $args | 这个变量等于请求行中的参数,同$query\_string | $remote\_port | 客户端的端口。 |
| $content\_length | 请求头中的Content-length字段。 | $remote\_user | 已经经过Auth Basic Module验证的用户名。 |
| $content\_type | 请求头中的Content-Type字段。 | $request\_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
| $document\_root | 当前请求在root指令中指定的值。 | $scheme | TTP方法(如http,https)。 |
| $host | 请求主机头字段,否则为服务器名称。 | $server\_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
| $http\_user\_agent | 客户端agent信息 | $server\_addr | 服务器地址,在完成一次系统调用后可以确定这个值。 |
| $http\_cookie | 客户端cookie信息 | $server\_name | 服务器名称。 |
| $limit\_rate | 这个变量可以限制连接速率。 | $server\_port | 请求到达服务器的端口号。 |
| $request\_method | 客户端请求的动作,通常为GET或POST。 | $request\_uri | 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz。 |
| $remote\_addr 客户端的IP地址。 | $uri | 不带请求参数的当前URI, | $uri |
| $document\_uri | 与$uri相同。 | – | – |


例如请求:`http://localhost:3000/test1/test2/test.php`


* `$host`:localhost
* `$server_port`3000
* `$request_uri`:/test1/test2/test.php
* `$document_uri`:/test1/test2/test.php
* `$document_root`:/var/www/html
* `$request_filename`:/var/www/html/test1/test2/test.php


#### 🏡5.3、符号参考




| 符号 | 说明 | 符号 | 说明 | 符号 | 说明 |
| --- | --- | --- | --- | --- | --- |
| `k,K` | 千字节 | `m,M` | 兆字节 | `ms` | 毫秒 |
| `s` | 秒 | `m` | 分钟 | `h` | 小时 |
| `d` | 日 | `w` | 周 | `M` | 一个月, 30天 |


例如,”8k”,”1m” 代表字节数计量。


例如,”1h 30m”,”1y 6M”。代表 “1小时 30分”,”1年零6个月”。


#### 🏢5.4、配置文件


nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于 nginx 安装目录下的 conf 目录下。


指令由 nginx 的各个模块提供,不同的模块会提供不同的指令来实现配置。 指令除了 Key-Value 的形式,还有作用域指令。


nginx.conf 中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。


 下面的这些上下文指令是用的比较多: 




| Directive | Description | Contains Directive |
| --- | --- | --- |
| main | nginx 在运行时与具体业务功能(比如 http 服务或者 email 服务代理)无关的一些参数,比如工作进程数,运行的身份等。 | user, worker\_processes, error\_log, events, http, mail |
| - | 比如工作进程数,运行的身份等。 | - |
| http | 与提供 http 服务相关的一些配置参数。例如:是否使用 keepalive 啊,是否使用 gzip 进行压缩等。 | server |
| server | http 服务上支持若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server. 每个 server 通过监听的地址来区分。 | listen, server\_name, access\_log, location, protocol, proxy, smtp\_auth, xclient |
| location | http 服务中,某些特定的 URL 对应的一系列配置项。 | index, root |
| mail | 实现 email 相关的 SMTP/IMAP/POP3 代理时,共享的一些配置项(因为可能实现多个代理,工作在多个监听地址上)。 | server, http, imap\_capabilities |
| include | 以便增强配置文件的可读性,使得部分配置文件可以重新使用。 | - |
| valid\_referers | 用来校验Http请求头Referer是否有效。 | - |
| try\_files | 用在server部分,不过最常见的还是用在location部分,它会按照给定的参数顺序进行尝试,第一个被匹配到的将会被使用。 | - |
| if | 当在location块中使用if指令,在某些情况下它并不按照预期运行,一般来说避免使用if指令。 | - |


**例如我们再 `nginx.conf` 里面引用两个配置 `vhost/example.com.conf 和 vhost/gitlab.com.conf` 它们都被放在一个我自己新建的目录 vhost 下面。nginx.conf 配置如下:**



worker_processes 1; 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;
    location / {
        root   html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
include  vhost/example.com.conf;
include  vhost/gitlab.com.conf;

}


 简单的配置: example.com.conf 



server { #侦听的80端口 listen 80; server_name baidu.com app.baidu.com; # 这里指定域名 index index.html index.htm; # 这里指定默认入口页面 root /home/www/app.baidu.com; # 这里指定目录 }


#### 🏣5.5、内置预定义变量


Nginx提供了许多预定义的变量,也可以通过使用set来设置变量。你可以在if中使用预定义变量,也可以将它们传递给代理服务器。以下是一些常见的预定义变量,[更多详见]( )




| 变量名称 | 值 |
| --- | --- |
| `$args_name` | 在请求中的name参数 |
| `$args` | 所有请求参数 |
| `$query_string` | $args的别名 |
| `$content_length` | 请求头Content-Length的值 |
| `$content_type` | 请求头Content-Type的值 |
| `$host` | 如果当前有Host,则为请求头Host的值;如果没有这个头,那么该值等于匹配该请求的server\_name的值 |
| `$remote_addr` | 客户端的IP地址 |
| `$request` | 完整的请求,从客户端收到,包括Http请求方法、URI、Http协议、头、请求体 |
| `$request_uri` | 完整请求的URI,从客户端来的请求,包括参数 |
| `$scheme` | 当前请求的协议 |
| `$uri` | 当前请求的标准化URI |


#### 🏤5.6、反向代理


 反向代理是一个Web服务器,它接受客户端的连接请求,然后将请求转发给上游服务器,并将从服务器得到的结果返回给连接的客户端。下面简单的反向代理的例子: 



server {
listen 80;
server_name localhost;
client_max_body_size 1024M; # 允许客户端请求的最大单文件字节数

location / { proxy_pass http://localhost:8080; proxy_set_header Host host:host:server_port; proxy_set_header X-Forwarded-For remote\_addr; # HTTP的请求端真实的IP proxy_set_header X-Forwarded-Proto scheme; # 为了正确地识别实际用户发出的协议是 http 还是 https } }


 复杂的配置: gitlab.com.conf。 



server { #侦听的80端口 listen 80; server_name git.example.cn; location / { proxy_pass http://localhost:3000; #以下是一些反向代理的配置可删除 proxy_redirect off; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) } }


 代理到上游服务器的配置中,最重要的是proxy\_pass指令。以下是代理模块中的一些常用指令: 




| 指令 | 说明 |
| --- | --- |
| `proxy_connect_timeout` | `Nginx`从接受请求至连接到上游服务器的最长等待时间 |
| `proxy_send_timeout` | 后端服务器数据回传时间(代理发送超时) |
| `proxy_read_timeout` | 连接成功后,后端服务器响应时间(代理接收超时) |
| `proxy_cookie_domain` | 替代从上游服务器来的`Set-Cookie`头的domain属性 |
| `proxy_cookie_path` | 替代从上游服务器来的`Set-Cookie头的path属性` |
| `proxy_buffer_size` | 设置代理服务器(nginx)保存用户头信息的缓冲区大小 |
| `proxy_buffers` | `proxy_buffers缓冲区`,网页平均在多少k以下 |
| `proxy_set_header` | 重写发送到上游服务器头的内容,也可以通过将某个头部的值设置为空字符串,而不发送某个头部的方法实现 |
| `proxy_ignore_header`s | 这个指令禁止处理来自代理服务器的应答。 |
| `proxy_intercept_errors` | 使`nginx阻止HTTP应答代码为400`或者更高的应答。 |


#### 🏥6、负载均衡


 upstream指令启用一个新的配置区段,在该区段定义一组上游服务器。这些服务器可能被设置不同的权重,也可能出于对服务器进行维护,标记为down。  
 



upstream gitlab { ip_hash; # upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 server 192.168.122.11:8081 ; server 127.0.0.1:82 weight=3; server 127.0.0.1:83 weight=3 down; server 127.0.0.1:84 weight=3; max_fails=3 fail_timeout=20s; server 127.0.0.1:85 weight=4;; keepalive 32; } server { #侦听的80端口 listen 80; server_name git.example.cn; location /

    proxy_pass   http://gitlab;    #在这里设置一个代理,和upstream的名字一样
    #以下是一些反向代理的配置可删除
    proxy_redirect             off;
    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    proxy_set_header           Host $host;
    proxy_set_header           X-Real-IP $remote\_addr;
    proxy_set_header           X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
    client_max_body_size       10m;  #允许客户端请求的最大单文件字节数
    client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
    proxy_connect_timeout      300;  #nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_send_timeout         300;  #后端服务器数据回传时间(代理发送超时)
    proxy_read_timeout         300;  #连接成功后,后端服务器响应时间(代理接收超时)
    proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers              4 32k;# 缓冲区,网页平均在32k以下的话,这样设置
    proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy\_buffers\*2)
    proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

}


 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。


**负载均衡:**


upstream模块能够使用3种负载均衡算法:轮询、IP哈希、最少连接数。


**轮询**: 默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器;


**IP哈希:** 通过ip\_hash指令来激活,Nginx通过IPv4地址的前3个字节或者整个IPv6地址作为哈希键来实现,同一个IP地址总是能被映射到同一个上游服务器;


**最少连接数:** 通过least\_conn指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server配置weight权重来说明,该算法将考虑到不同服务器的加权最少连接数。


#### 🏦6.1、RR


**简单配置** 这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问 `http://localhost` 的时候,也不会有问题,会默认跳转到`http://localhost:8080`具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置



pstream test { server localhost:8080; server localhost:8081; } server { listen 81; server_name localhost; client_max_body_size 1024M;

location / {
    proxy_pass http://test;
    proxy_set_header Host $host:$server\_port;
}

}


 负载均衡的核心代码为 



upstream test { server localhost:8080; server localhost:8081; }


**权重**


 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如: 



upstream test { server localhost:8080 weight=9; server localhost:8081 weight=1; }


 那么10次一般只会有1次会访问到8081,而有9次会访问到8080。 


#### 🏨6.2、ip\_hash


上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。



pstream test { ip_hash; server localhost:8080; server localhost:8081; }


#### 🏩6.3、fair


这是个第三方模块,按后端服务器的响应时间来分配请求,响应时间短的优先分配。



upstream backend { fair; server localhost:8080; server localhost:8081; }


#### 🏪6.4、url\_hash


这是个第三方模块,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash\_method是使用的hash算法



upstream backend { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081; }


以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url\_hash需要安装第三方模块才能使用。


**server指令可选参数:**  
 1、weight:设置一个服务器的访问权重,数值越高,收到的请求也越多;


2、fail\_timeout:在这个指定的时间内服务器必须提供响应,如果在这个时间内没有收到响应,那么服务器将会被标记为down状态;


3max\_fails:设置在fail\_timeout时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么服务器将会被标记为down;


4、down:标记一个服务器不再接受任何请求;


5、backup:一旦其他服务器宕机,那么有该标记的机器将会接收请求。


**keepalive指令:**


Nginx服务器将会为每一个worker进行保持同上游服务器的连接。


#### 🏫6.5、屏蔽ip


在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit\_except语句块,需要注意相对路径,本例当中nginx.conf,blocksip.conf在同一个目录中。



include blockip.conf;


 在blockip.conf里面输入内容,如:



deny 165.91.122.67;

deny IP; # 屏蔽单个ip访问 allow IP; # 允许单个ip访问 deny all; # 屏蔽所有ip访问 allow all; # 允许所有ip访问 deny 123.0.0.0/8 # 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令 deny 124.45.0.0/16 # 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令 deny 123.45.6.0/24 # 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令

如果你想实现这样的应用,除了几个IP外,其他全部拒绝

allow 1.1.1.1; allow 1.1.1.2; deny all;


### 🏬7、第三方模块安装方法



./configure --prefix=/你的安装目录 --add-module=/第三方模块目录


#### 🏭7.1、重定向


* permanent 永久性重定向。请求日志中的状态码为301
* redirect 临时重定向。请求日志中的状态码为302


#### 🏯7.2、重定向整个网站



server { server_name old-site.com return 301 scheme://newsite.comscheme://new-site.comrequest_uri; }


#### 🏰7.3、重定向单页



server { location = /oldpage.html { return 301 example.org/newpage.htm…; } }


#### 💒7.4、重定向整个子路径



location /old-site { rewrite ^/old-site/(.*) example.org/new-site/$1 permanent; }


### 🗼8、性能



#### 🗽8.1、内容缓存


 允许浏览器基本上永久地缓存静态内容。 Nginx将为您设置Expires和Cache-Control头信息。  
 



location /static { root /data; expires max; }


 如果要求浏览器永远不会缓存响应(例如用于跟踪请求),请使用-1。 



location = /empty.gif { empty_gif; expires -1; }


#### ⛪8.2、Gzip压缩



gzip on; gzip_buffers 16 8k; gzip_comp_level 6; gzip_http_version 1.1; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; gzip_disable "msie6";


#### 🕌8.3、 打开文件缓存



open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;


#### 🛕8.4、SSL缓存



ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;


#### 🕍8.5、上游Keepalive



upstream backend { server 127.0.0.1:8080; keepalive 32; } server { ... location /api/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; } }


#### ⛩️8.6、监控


使用`ngxtop`实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top。所有示例都读取nginx配置文件的访问日志位置和格式。如果要指定访问日志文件和/或日志格式,请使用-f和-a选项。


 注意:在nginx配置中`/usr/local/nginx/conf/nginx.conf`日志文件必须是绝对路径。 



安装 ngxtop

pip install ngxtop

实时状态

ngxtop

状态为404的前10个请求的路径:

ngxtop top request_path --filter 'status == 404'

发送总字节数最多的前10个请求

ngxtop --order-by 'avg(bytes_sent) * count'

排名前十位的IP,例如,谁攻击你最多

ngxtop --group-by remote_addr

打印具有4xx或5xx状态的请求,以及status和http referer

ngxtop -i 'status >= 400' print request status http_referer

由200个请求路径响应发送的平均正文字节以'foo'开始:

ngxtop avg bytes_sent --filter 'status == 200 and request_path.startswith("foo")'

使用“common”日志格式从远程机器分析apache访问日志

ssh remote tail -f /var/log/apache2/access.log | ngxtop -f common


### 🕋9、常见使用场景



#### ⛲9.1、跨域问题


 在工作中,有时候会遇到一些接口不支持跨域,这时候可以简单的添加add\_headers来支持cors跨域。配置如下: 



server { listen 80; server_name api.xxx.com;

add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET,POST,HEAD';

location / { proxy_pass http://127.0.0.1:3000; proxy_set_header X-Real-IP remote_addr;proxysetheaderXForwardedForremote\_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; proxy_set_header Host $http_host;
} }


 上面更改头信息,还有一种,使用 rewrite 指令重定向URI来解决跨域问题。 



upstream test { server 127.0.0.1:8080; server localhost:8081; } server { listen 80; server_name api.xxx.com; location / { root html; #去请求../html文件夹里的文件 index index.html index.htm; #首页响应地址 }

用于拦截请求,匹配任何以 /api/开头的地址,

匹配符合以后,停止往下搜索正则。

location ^~/api/{ # 代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用, # 例如www.a.com/proxy/api/msg?meth=1&par=2重写,只对/proxy/api/msg重写。 # rewrite后面的参数是一个简单的正则 ^/api/(.*), # 1代表正则中的第一个(),2代表第二个()的值,以此类推。rewrite/api/(.)2代表第二个()的值,以此类推。 rewrite ^/api/(.*) /$1 break;

# 把请求代理到其他主机 

# 其中 http://www.b.com/ 写法和 http://www.b.com写法的区别如下

# 如果你的请求地址是他 http://server/html/test.jsp

# 配置一: http://www.b.com/ 后面有“/” 

# 将反向代理成 http://www.b.com/html/test.jsp 访问

# 配置一: http://www.b.com 后面没有有“/” 

# 将反向代理成 http://www.b.com/test.jsp 访问
proxy_pass http://test;


# 如果 proxy\_pass URL 是 http://a.xx.com/platform/ 这种情况

# proxy\_cookie\_path应该设置成 /platform/ / (注意两个斜杠之间有空格)。
proxy_cookie_path /platfrom/ /;


# http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html#proxy\_pass\_header

# 设置 Cookie 头通过
proxy_pass_header Set-Cookie;

} }


#### ⛺9.2、跳转到带www的域上面



server { listen 80; # 配置正常的带www的域名 server_name www.wangchujiang.com; root /home/www/wabg/download; location / { try_files uriuri uri/ /index.html =404; } } server { # 这个要放到下面, # 将不带www的 wangchujiang.com 永久性重定向到 www.wangchujiang.com server_name wangchujiang.com; rewrite ^(.*) www.wangchujiang.com$1 permanent; }


#### 🌁9.3、代理转发



upstream server-api{ # api 代理服务地址 server 127.0.0.1:3110;
} upstream server-resource{ # 静态资源 代理服务地址 server 127.0.0.1:3120; } server { listen 3111; server_name localhost; # 这里指定域名 root /home/www/server-statics; # 匹配 api 路由的反向代理到API服务 location ^/api/ { rewrite ^/(.)/ /1 break; proxy_pass http://server-api; } # 假设这里验证码也在API服务中 location ^~/captcha { rewrite ^/(.)/ /1 break; proxy_pass http://server-api; } # 假设你的图片资源全部在另外一个服务上面 location ^/img/ { rewrite ^/(.*)/ /1 break; proxy_pass http://server-resource; } # 路由在前端,后端没有真实路由,在路由不存在的 404状态的页面返回 /index.html # 这个方式使用场景,你在写React或者Vue项目的时候,没有真实路由 location / { try_files uriuri uri/ /index.html =404; # ^ 空格很重要 } }


#### 🌃9.4、监控状态信息


 通过 `nginx -V` 来查看是否有 `with-http_stub_status_module` 该模块。 


 `nginx -V` 这里 V 是大写的,如果是小写的 `v``nginx -v`,则不会出现有哪些模块,只会出现 `nginx` 的版本。 



ocation /nginx_status { stub_status on; access_log off; }


 通过 `http://127.0.0.1/nginx_status` 访问出现下面结果。 



Active connections: 3 server accepts handled requests 7 7 5 Reading: 0 Writing: 1 Waiting: 2


 **1、主动连接(第 1 行)** 


**当前与http建立的连接数,包括等待的客户端连接:3**


 **2、服务器接受处理的请求(第 2~3 行)** 


**接受的客户端连接总数目:7**


**处理的客户端连接总数目:7**


**客户端总的请求数目:5**


 **3、读取其它信(第 4 行)** 


**当前,nginx读请求连接**


**当前,nginx写响应返回给客户端**


**目前有多少空闲客户端请求连接**


#### 🏙️9.5、代理转发连接替换



location ^~/api/upload { rewrite ^/(.*)$ /wfs/v1/upload break; proxy_pass http://wfs-api; }


#### 🌄9.6、SSL配置


超文本传输安全协议(`缩写:HTTPS,英语:Hypertext Transfer Protocol Secure`)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混。HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是大型网站的专利,所有普通的个人站长和博客均可以自己动手搭建一个安全的加密的网站。


创建SSL证书,如果你购买的证书,就可以直接下载



sudo mkdir /etc/nginx/ssl

创建了有效期100年,加密强度为RSA2048的SSL密钥key和X509证书文件。

sudo openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

上面命令,会有下面需要填写内容

Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:your_domain.com Email Address []:admin@your_domain.com


 创建自签证书 



首先,创建证书和私钥的目录

mkdir -p /etc/nginx/cert

cd /etc/nginx/cert

创建服务器私钥,命令会让你输入一个口令:

openssl genrsa -des3 -out nginx.key 2048

创建签名请求的证书(CSR):

openssl req -new -key nginx.key -out nginx.csr

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

cp nginx.key nginx.key.org

openssl rsa -in nginx.key.org -out nginx.key

最后标记证书使用上述私钥和CSR:

openssl x509 -req -days 365 -in nginx.csr -signkey nginx.key -out nginx.crt


 查看目前nginx编译选项 



sbin/nginx -V


 输出下面内容 



nginx version: nginx/1.7.8 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx-1.7.8 --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre