Nginx 官网:https://www.nginx.com/ Nginx 官方文档:http://nginx.org/en/docs/ **目录** 1. [Nginx 介绍及基本使用](#1nginx介绍及基本使用) 2. [Nginx 基本配置](#2nginx基本配置) 3. [Nginx 日志](#3nginx日志) --- #### 1.Nginx 介绍及基本使用 Nginx:*Nginx* 是一个高性能的 *HTTP* 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 邮件服务。相对于同类 web 服务器如 *Tomcat*,*Apache*,*Jetty*等,Nginx 的高并发处理能力强、擅长处理静态请求、反向代理和均衡负载,所以经常用来做静态内容服务和代理服务器。 *Nginx* 的特点: - 跨平台:Nginx 可以在大多数 Unix like OS 编译运行,而且也有Windows的移植版本。 - 高并发处理能力强:通信机制采用 epoll 模型,非阻塞 IO,支持高并发连接,且在处理大并发的请求时内存消耗非常小。 - master/worker 结构:一个master进程,生成一个或多个worker进程 - 成本低廉:Nginx为开源软件,可以免费使用。 - 可以节省带宽:Nginx 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。 - 稳定性高:用于反向代理时,宕机的概率微乎其微。 正向代理和反向代理: - 正向代理:正向代理类似一个跳板机,代理访问外部资源;客户端发出请求到代理服务器,由代理服务器向原始服务器发出请求接收到响应,然后再由代理服务器将响应返回给客户端;此时代理服务器代理客户端进行资源访问,服务端不知道实际发起请求的客户端。 - 反向代理:代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端;此时代理服务器代理服务端进行请求响应,客户端不知道实际提供服务的服务端。
--- #### 2.Nginx 安装 1. 安装Nginx ```shell [root@localhost /]# dnf install nginx -y ``` 系统会自动解决相关依赖并安装Nginx。 2. Nginx基本命令 使用 dnf 安装 nginx 后,系统会将其自动加入 systemctl 进行管理。 ```shell [root@localhost /]# systemctl start nginx 启动nginx [root@localhost /]# systemctl stop nginx 停止nginx [root@localhost /]# systemctl status nginx 查看nginx状态 ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled) Active: inactive (dead) 9月 11 00:20:15 localhost.localdomain systemd[1]: nginx.service: Unit cannot be reloaded because it is inactive. 9月 11 00:20:58 localhost.localdomain systemd[1]: Starting The nginx HTTP and reverse proxy server... 9月 11 00:20:58 localhost.localdomain nginx[27331]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 9月 11 00:20:58 localhost.localdomain nginx[27331]: nginx: configuration file /etc/nginx/nginx.conf test is successful 9月 11 00:20:59 localhost.localdomain systemd[1]: Started The nginx HTTP and reverse proxy server. 9月 11 00:30:10 localhost.localdomain systemd[1]: Stopping The nginx HTTP and reverse proxy server... 9月 11 00:30:10 localhost.localdomain systemd[1]: Stopped The nginx HTTP and reverse proxy server. [root@localhost /]# systemctl restart nginx 重启nginx [root@localhost /]# systemctl reload nginx 重新加载nginx配置 [root@localhost /]# systemctl enable nginx 添加nginx开机启动 Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service. [root@localhost /]# systemctl disable nginx 关闭nginx开机启动 Removed /etc/systemd/system/multi-user.target.wants/nginx.service. ``` 3. 开放系统防火墙的80端口(Nginx默认已配置监听80端口) ```shell [root@localhost /]# firewall-cmd --query-port=80/tcp 查询80端口是否对外开放 no [root@localhost /]# firewall-cmd --add-port=80/tcp --permanent 永久对外开放80端口 success [root@localhost /]# firewall-cmd --reload 重启防火墙 success ``` 4. Nginx启动后,登录网页查看Nginx配置的默认页面 ```http http://192.168.253.128/ ``` 默认页面如图:

5. DNF 安装 Nginx 后各个文件目录位置 - 安装位置:/etc/nginx/,各种配置文件,参数文件都在此目录下。 ```shell [root@localhost nginx]# ls conf.d fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf scgi_params uwsgi_params win-utf default.d fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi_params.default ``` - web服务器默认目录:/usr/share/nginx/,此目录下有一个html目录用来存放网页文件,其中的 index.html 即为 Nginx 配置的默认页面。 - 日志存放路径:/var/log/nginx/ - 帮助文档存放路径:/usr/share/doc/nginx/ 在使用 DNF 软件包管理器安装 Nginx 后,官方的二进制命令文件的位置在 /usr/sbin/nginx,我们可以通过命令行参数和控制信号运行脚本文件使 Nginx 作出不同的行为(也可以使用 systemctl 命令管理 Nginx 服务)。 *Nginx* 常用命令行参数: - -?,-h:显示帮助。 - -c filename:启动时为 Nginx 指定一个配置文件来代替缺省的配置文件。 - -t:不运行 Nginx,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。 - -v,-V:查看 Nginx 的版本(以及编译器版本和配置参数)。 - -s signal:向主进程发送信号,quit(正常停止),stop(强制停止),reload(重新加载),reopen(重新打开日志文件,日志切割时使用)。 ~~~shell [root@localhost ~]# nginx -c /etc/nginx/nginx.conf #启动 nginx 服务 [root@localhost ~]# nginx -s reload #重新加载 nginx 服务 ~~~ *Nginx* 主要控制信号: - *TERM*, *INT*:快速停止服务,不建议。 - *QUIT*:优雅地关闭服务。 - *HUP*:配置重载,使用新配置启动新 worker 进程,正常关闭旧的 worker 进程。 - *USR1*:重新打开日志文件(日志切割时使用)。 - *USR2*:平滑的升级二进制脚本文件。 - *WINCH*:优雅地关闭 worker 进程。 *Nginx* 控制信号使用方法:使用 kill 命令向 Nginx 主进程发送控制信号。 1. 获取 Nginx 的主进程 ID: ~~~shell [root@localhost nginx]# ps -ef|grep nginx root 2257 1 0 01:52 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 2265 2257 0 01:53 ? 00:00:00 nginx: worker process nginx 2266 2257 0 01:53 ? 00:00:00 nginx: worker process nginx 2267 2257 0 01:53 ? 00:00:00 nginx: worker process nginx 2268 2257 0 01:53 ? 00:00:00 nginx: worker process root 2348 2181 0 02:05 pts/0 00:00:00 grep --color=auto nginx [root@localhost nginx]# cat /run/nginx.pid 2257 ~~~ - 使用 kill 命令发送控制信号: ~~~shell [root@localhost nginx]# kill -HUP 2257 [root@localhost nginx]# kill -QUIT $(cat /run/nginx.pid) [root@localhost nginx]# ps -ef|grep nginx root 2373 2181 0 02:08 pts/0 00:00:00 grep --color=auto nginx ~~~ --- #### 3.Nginx 主配置文件 Nginx 主配置文件位于 /etc/nginx/nginx.conf,可以被分为 3 部分: 1. 全局块:从配置文件开始到 events 块之间的内容,用来设置一些会影响 Nginx 服务器整体运行的配置指令,主要包括运行 Nginx 的用户(组),允许生成的 worker process 数,进程 PID 的存放路径、日志存放路径和类型、配置文件引入等。 2. events 块:主要配置 Nginx 服务器与用户的网络连接,常见的如:是否允许同时接受多个网络连接、选用哪种事件驱动模型来处理连接请求、每个 work process 可以同时支持的最大连接数等。 3. http 块:http 块中又包含了 2 个部分,http 全局块和 server 部分 1. http 全局块:包括了文件引入、MIME-TYPE 定义、日志定义、连接超时时间等。 2. server 块:配置一个虚拟主机(应用服务),每个 http 块可以包含多个 server 块,每一个 server 块都是一个独立的应用服务。 :first_quarter_moon: 全局块配置: ~~~nginx user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; ~~~ - user:后面可以跟用户(及用户组),定义 Nginx 运行的用户和用户组,当 Nginx 主线程启动后会使用此处配置的用户启动 worker 进程。 ~~~shell user nginx xxx; # 以 xxx 用户组,nginx 用户的身份启动 work 线程 ~~~ - worker_processes:工作进程的数量,一般设置为机器的核心数量(CPU 数 * 每个 CPU 的核心数),当设置为 auto 时,nginx 会根据核心数生成对应数量的 worker 进程。 - error_log:错误日志的存放路径,可以同时定义日志级别(debug :biking_woman: 在 server 块中我们配置具体的虚拟主机,也是在开发中需要我们配置的主要部分。 --- #### 4.Nginx 反向代理配置 一般来说,每部署一个服务,都在 /etc/nginx/conf.d 目录下新增一个 xxxx.conf 配置 server 信息,每个服务的文件互不干扰。 在 /etc/nginx/conf.d 目录下新建 demo.conf 文件,文件内容如下: ~~~nginx server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://127.0.0.1:8080; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } ~~~ - listen:定义要监听的端口 - `listen 80;`:监听所有的 ipv4 地址的 80 端口。 - `listen [::]:80;`:监听所有的 ipv6 地址的 80 端口。 - `listen 192.168.1.6:80;`:只监听 192.168.1.6 的 ipv4 地址下的 80 端口。 - `listen [fe80::919c:9a57:127f:5a8a]:80;`:只监听 *fe80::919c:9a57:127f:5a8a* 的 ipv6 地址下的 80 端口。 - *default_server*:将此 server 定义为默认的 server(一个 http 块中可以配置多个 server 模块),当请求的域名未匹配到任何 server_name 时,nginx 将会使用 default_server 来处理请求,如果均未配置 default_server,使用第一个 server 进行请求处理。 - server_name:定义域名,可以定义多个,使用空格隔开,也可以使用正则表达式。配置 server_name 后,相当于本机的 hosts 文件( _ 为官方随意指定的一个无效域名,无任何意义)。 - root:定义根目录,nginx 会根据该目录进行文件映射,例如:nginx 配置 `root /usr/share/nginx/html;`,用户访问 /project/xxx.html 时,nginx 则会返回 /usr/share/nginx/html/project/xxx.html 文件。 - include:将其他配置文件包含进来。 - location:指定路径匹配规则,/ 为匹配任何路径。 - error_page:定义发生错误的时候需要显示一个的定义的 uri。 ~~~nginx error_page 500 502 503 504 /50x.html; location = /50x.html { } ~~~ 当发生 500,502,503,504 错误时转到 /50x.html,使用 `location = /50x.html` 匹配该路径然后再 location 块中作具体配置。 > server 中还可以配置 index(缺省为 nginx 根目录下的 index.html),代理服务响应时间,缓存等多种参数。 在 location 区域中,配置了用于反向代理的路径跳转: ~~~nginx location / { proxy_pass http://127.0.0.1:8080; index index.html; } ~~~ 当用户访问 http://192.168.253.133:80 时(Nginx 服务器 IP),将被代理到服务器上的 8080 端口下进行访问。 > 如果对不同的路径有多种代理方式,可以配置多个 location 进行代理。 location 匹配规则: `location [=|~|~*|^~] /uri/ { … }` 1. 什么都不带时,表示以 xxx 开头的 uri,如:`location /demo {...}` 2. `=`:开头表示精确匹配(会忽略 get 请求的参数),例: `location = /demo {...}` 3. `~`:开启 uri 包含的正则匹配(区分大小写),例:`location ~ /list/[0-9] {...}` 4. `^~`:用于不包含正则表达式的 uri 前,相当于以 xxx 开头,例:`location ^~ /xxx {...}` 5. `~` 开头表示区分大小写的正则匹配 以xx结尾 6. `~*`:开启 uri 包含的正则匹配(不区分大小写)。 7. `!~` 和 `!~*`:分别表示区分大小写的不匹配和不区分大小写的不匹配的正则。 8. `/`:通用匹配,任何请求都会匹配到。 --- #### 5.Nginx 负载均衡配置 Nginx 支持对多态服务器进行负载均衡,还自带了多种负载均衡策略。 负载均衡的配置方法: 1. 配置 upstream(配置位置为 http 配置段内): ~~~nginx upstream myserver { server 192.168.253.132:8080; server 192.168.253.132:8081; } ~~~ 2. 将 server 段的 server_name 配置为本机 IP。 3. 配置反向代理的代理内容: ~~~nginx proxy_pass http://myserver; ~~~ Nginx 负载均衡策略: 1. 轮询:默认的负载均衡策略,每个请求按时间的先后顺序分配到不同的后端服务器上。 配置方法就是上例中的配置。 2. 权重:指定轮询几率的负载均衡方式,默认情况下的权重是 1,权重越高,访问到的几率越大。 ~~~nginx upstream myserver { server 192.168.253.132:8080 weight=5; server 192.168.253.132:8081 weight=10; } ~~~ 3. 根据客户端 IP 进行 Hash 然后分配,每一个客户端只能访问到其中某一台服务器上,可以解决 session 存储的问题。 ~~~nginx upstream myserver { ip_hash; server 192.168.253.132:8080; server 192.168.253.132:8081; } ~~~ 4. fair:按照后端服务器的响应时间来分配权重,响应时间短的进行优先分配 ~~~nginx upstream myserver { server 192.168.253.132:8080; server 192.168.253.132:8081; fair; } ~~~ 5. 最少连接策略:把请求转发给连接数较少的后端服务器。 ~~~nginx upstream myserver { least_conn; server 192.168.253.132:8080; server 192.168.253.132:8081; } ~~~ 6. 根据 url 的 Hash 值来进行分配,同一个 url 一般定向到同一个后端服务器,一般配合本地缓存进行使用。 ~~~nginx upstream myserver { hash $request_uri; server 192.168.253.132:8080; server 192.168.253.132:8081; } ~~~ --- #### 6.Nginx 动静分离 动静分离就是指将动态请求和静态请求分离开来,使用 Nginx 来处理静态页面,而数据内容(动态请求)代理到后端服务器进行完成。 Nginx 通过不同的 location 映射来进行动静分离功能的实现。 配置文件内容: ~~~nginx location /data/ { proxy_pass http://127.0.0.1:8080; } location / { root /usr/share/nginx/html; index index.html; } ~~~ Nginx 从上到下进行匹配,如果 url 已 data 开头,则进入后端服务器进行处理,否则继续向下匹配代理到本机的静态资源。 --- #### 7.Nginx 高可用 在实际的生产环境中,如果使用一个 Nginx 来代理所有的访问请求,一旦 Nginx 出现故障,那么整个应用将处于不可访问的状态。 一般情况下,我们搭建一个 Nginx 集群并结合 Keepalived 实现 Nginx 的高可用。 Keepalived:它是 Linux 下的一个轻量级的高可用解决方案,用来监控集群系统中各个服务节点的状态。如果某个服务节点出现异常,将被 Keepalived 检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived 又可以自动将此服务节点重新加入服务器集群中。 安装 Keepalived: ~~~shell [root@localhost nginx]# dnf install Keepalived ~~~ 安装后的配置文件位置:/etc/keepalived 修改 Keepalived 的配置文件: 1. Nginx 服务器 Keepalived 配置: ~~~nginx ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_connect_timeout 30 router_id LVS_DEVEL # 路由 ID,需要在 hosts 文件中配置 127.0.0.1 LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER # 备机配置为 BACKUP interface ens32 virtual_router_id 51 # 路由 ID,主备机的值应该相等 priority 100 # 权重,主机应大于备机 advert_int 1 # 检查的时间间隔,默认为 1 秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.253.88 # 虚拟 IP 地址 } } ~~~ 修改 hosts 文件添加:`127.0.0.1 LVS_DEVEL`。 备 Nginx 服务器 Keepalived 配置与主机基本保持一致。 启动 keepalived:`systemctl start keepalived.service` 2. 配置 Nginx 配置文件 demo.conf: ~~~nginx server { listen 7000; root /usr/share/nginx/html; location / { proxy_pass http://192.168.253.128:8080; } } ~~~ 重新加载 Nginx 配置文件。 3. 需要关闭 SELinux,否则可能会对 Keepalived 有影响。 确定防火墙开启了对应端口后,即可进行测试。 --- #### 8.Nginx 原理 Nginx 默认采用多进程工作方式,Nginx 启动后,会运行一个 master 进程和多个 worker 进程。 master 充当整个进程组与用户的交互接口,同时对进程进行监护,管理 worker 进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker 用来处理基本的网络事件,worker 之间是平等的,他们共同竞争来处理来自客户端的请求。 ![](Image/1183448-20180210145226654-1347579045.png) 使用 master-worker 机制的好处: 1. 可以使用 nginx –s reload 进行热部署(不会一次性地停掉所有 worker)。 2. 每个 woker 都是独立的进程,不需要加锁,节省了很多开销,如果有其中的一个 woker 出现问题也不会影响到其他 worker,不会造成服务中断。 Nginx 多进程事件模型:异步非阻塞 虽然 Nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,但是 Nginx 采用了异步非阻塞(EPOLL)的方式来处理请求,也就是说,Nginx 是可以同时处理成千上万个请求的。一个 worker 进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的 worker 进程之间处理并发请求时几乎没有同步锁的限制,worker 进程通常不会进入睡眠状态,因此,当 Nginx 上的进程数与 CPU 核心数相等时,进程间切换的代价是最小的