高性能WEB服务器Nginx

Nginx 基础

Nginx 介绍

Nginx 是一个强大而灵活的服务器软件,适用于处理高流量、高并发的Web应用程序,同时具有反向代 理、负载均衡、静态文件服务等多种功能。由于其性能和可配置性,NGINX被广泛应用于许多大型网站 和应用,NGINX 由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点开发的,开发工作最早从 2002年开始,第一版发公开发布时间是 2004 年 10月4日,版本号为 0.1.0

Nginx 经历了十几年的迭代更新(nginx.org/en/CHANGES),目前功能己经非常完善且运行稳定,当前 该项目分为社区版和商业版,社区版里面又分为开发版(版本号为奇数),最新稳定版(版本号为偶 数)和过期版,Nginx 功能丰富,可以作为 WEB 服务器使用,也可以作为反向代理服务器或者邮件服务 器,能够快速的响应静态网页请求,支持 FastCGI/SSL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth/HTTP 或 TCP 负载均衡(v1.9版本以上且开启 stream 模块)等功能,并且支持第三方的功能扩展

另外,还有一些基于 Nginx 做二次开发的项目,其中比较著名的有 Tengine,OpenResty 等

Nginx 架构和工作模型

Nginx 整体架构

Nginx 工作模型

在Nginx中,Master进程和Worker进程分别承担不同的角色,共同协作以提供高性能的服务

Master 进程

  • 启动过程: 当你启动Nginx时,Master进程首先启动。它会读取配置文件,初始化全局资源,并创 建指定数量的Worker进程

  • 创建 Worker 进程: Master进程会创建Worker进程来处理实际的客户端请求。每个Worker进程 都是一个独立的进程,它们之间相互独立,互不影响

  • 管理 Worker 进程: Master进程负责监控Worker进程的状态。如果某个Worker进程异常退出 (比如发生错误),Master进程会重新启动一个新的Worker进程,以确保服务的可用性

Worker 进程

  • 处理客户端请求: Worker进程是实际处理客户端请求的进程。每个Worker进程是单线程的,但通 过多进程的方式,Nginx能够同时处理多个请求,实现高并发

  • 事件驱动和异步处理: Worker进程采用事件驱动的异步模型。它使用事件循环和非阻塞I/O操作, 允许在不同的连接之间高效切换,以处理大量并发请求

  • 负载均衡: 如果配置了负载均衡,多个Worker进程可以分担负载,均衡地分配请求,提高系统的 整体性能

Master 进程 与 Worker 进程的联系

在运行时,Master 进程负责监控 Worker 进程的状态,如果某个 Worker 进程异常退出,Master 进程 会重新启动一个新的 Worker 进程,确保服务的稳定性。Master 进程和 Worker 进程之间通过信号进行通信

例如在重新加载配置时,Master 进程会向 Worker 进程发送信号,通知它们重新加载配置而无需 停止服务

这种Master-Worker模型使Nginx在高并发环境下表现出色,同时能够保持稳定性和可扩展性。Master 进程和Worker进程之间的协同工作是Nginx架构的关键之一

#nginx 中的 master 进程和 worker 进程
[root@ubuntu24 ~]# ps aux | grep nginx
root        4037  0.0  0.0  11580  1716 ?        Ss   20:20   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data    4038  0.0  0.0  11952  2612 ?        S    20:20   0:00 nginx: worker process
www-data    4039  0.0  0.0  11952  2612 ?        S    20:20   0:00 nginx: worker process
www-data    4040  0.0  0.0  11952  2612 ?        S    20:20   0:00 nginx: worker process
www-data    4042  0.0  0.0  11952  2612 ?        S    20:20   0:00 nginx: worker process

[root@ubuntu24 ~]# pstree -p | grep nginx
           |-nginx(4037)-+-nginx(4038)
           |             |-nginx(4039)
           |             |-nginx(4040)
           |             `-nginx(4042)

Nginx 模块

Nginx的模块化设计使得用户可以根据需求选择并集成不同类型的模块,从而定制化地配置和扩展Nginx 服务器的功能

Nginx 模块可以分为两大类:核心模块和第三方模块

核心模块(Core Modules)

Nginx 的核心模块主要有三部份,分别是

  • Events Module: 处理与事件相关的操作,如连接的接受和关闭。包括事件驱动机制等

  • HTTP Module: 处理 HTTP 请求和响应,包括配置 HTTP 服务器、反向代理和负载均衡等

  • Mail Module:提供邮件代理服务顺的功能,支持 IMAP,POP3等协议

基中 HTTP 模块又包含以下几部份

  • Core Module: 包含基本的 HTTP 功能,如配置服务器块、location 块等

  • Access Module: 处理访问控制,包括允许或拒绝特定的 IP 地址或用户 FastCGI

  • Module: 支持 FastCGI 协议,用于与 FastCGI 进程通信

  • Proxy Module: 提供反向代理功能,用于将请求代理到后端服务器

  • Upstream Module: 用于定义负载均衡的后端服务器组

第三方模块(HTTP Modules)

Nginx提供了一套模块化的架构,允许开发者编写自定义的模块来扩展功能。这些第三方模块可以包括 但不限于以下几类

  • HTTP 模块: 扩展HTTP模块的功能,添加自定义的处理逻辑

  • Filter 模块: 提供对HTTP请求和响应进行过滤的功能

  • Load Balancer 模块: 实现负载均衡策略

  • Access Control 模块: 控制对资源的访问权限

  • Security 模块: 提供安全性增强的功能,如防火墙、DDoS防护等

  • Authentication 模块: 处理用户认证逻辑

Nginx 版本和安装

Nginx 版本

Nginx 官方将 Nginx 分为三个类型的版本,分别是 Mainline,Stable,Legacy

Mainline(主线版)

  • Mainline 版本是 Nginx 的主要开发版本,包含最新的功能和改进,这个版本通常包含最新的实验 性功能和性能优化,但相对较新,可能存在一些未经广泛测试的特性

  • Mainline 版本是面向那些希望尝试最新功能并能够接受一些潜在风险的用户和开发者

  • Mainline 版在完成充分的测试和功能迭代之后会变成 Stable 版,然后官方会开一个新的 Mainline 版

  • Mainline 版的版本号一般为奇数

Stable(稳定版)

  • Stable 版本是相对于 Mainline 版本更为稳定和经过充分测试的版本,它包含了经过验证的功能和 修复了已知问题的代码

  • Stable 版本是面向那些更注重稳定性和可靠性的生产环境用户的选择,该版本可能不包含最新的功 能,但在生产环境中更为安全可靠

  • Stable 版的版本号一般为偶数

Legacy (历史版本)

  • 己经归档的稳定版,版本号一般为偶数

用户可以根据其需求选择使用 Mainline 版本或 Stable 版本,在开发和测试阶段,可以选择 Mainline 版 本以获得最新的功能和改进。而在生产环境中,通常建议选择 Stable 版本,以确保系统的稳定性和可靠 性

Nginx 安装

Nginx 二进制包安装

Nginx 一般可以使用 apt/yum 来安装二进制包,如果需要使用特定的功能模块,也可以使用源码安装, 使用 yum/apt 安装的时候,只能安装操作系统发行版厂商己经提交到仓库中的版本,如果需要安装更新 的版本或历史版本,可自行配置官方仓库,然后进行安装

[root@ubuntu24 ~]# dpkg -l nginx
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version         Architecture Description
+++-==============-===============-============-==========================================
ii  nginx          1.24.0-2ubuntu7 amd64        small, powerful, scalable web/proxy server

#有多个包
[root@ubuntu24 ~]# dpkg -L nginx
/.
/usr
/usr/sbin
/usr/sbin/nginx
/usr/share
/usr/share/doc
/usr/share/doc/nginx
/usr/share/doc/nginx/changelog.Debian.gz
/usr/share/doc/nginx/copyright
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/nginx.8.gz


#配置文件,默认网站根目录文件,模块目录等
[root@ubuntu24 ~]# ls -l /etc/nginx/
total 68
drwxr-xr-x 2 root root 4096 Mar 31 10:40 conf.d
-rw-r--r-- 1 root root 1125 Dec  1  2023 fastcgi.conf
-rw-r--r-- 1 root root 1055 Dec  1  2023 fastcgi_params
-rw-r--r-- 1 root root 2837 Dec  1  2023 koi-utf
-rw-r--r-- 1 root root 2223 Dec  1  2023 koi-win
-rw-r--r-- 1 root root 5465 Dec  1  2023 mime.types
drwxr-xr-x 2 root root 4096 Mar 31 10:40 modules-available
drwxr-xr-x 2 root root 4096 Mar 31 10:40 modules-enabled
-rw-r--r-- 1 root root 1446 Dec  1  2023 nginx.conf
-rw-r--r-- 1 root root  180 Dec  1  2023 proxy_params
-rw-r--r-- 1 root root  636 Dec  1  2023 scgi_params
drwxr-xr-x 2 root root 4096 Sep 10 20:20 sites-available
drwxr-xr-x 2 root root 4096 Sep 10 20:20 sites-enabled
drwxr-xr-x 2 root root 4096 Sep 10 20:20 snippets
-rw-r--r-- 1 root root  664 Dec  1  2023 uwsgi_params
-rw-r--r-- 1 root root 3071 Dec  1  2023 win-utf


#查看编译选项
[root@ubuntu24 ~]# nginx -V
nginx version: nginx/1.24.0 (Ubuntu)
built with OpenSSL 3.0.10 1 Aug 2023 (running with OpenSSL 3.0.13 30 Jan 2024)
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx-uqDps2/nginx-1.24.0=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=/build/nginx-uqDps2/nginx-1.24.0=/usr/src/nginx-1.24.0-2ubuntu7 -fPIC -Wdate-time -D_FORTIFY_SOURCE=3' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=stderr --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module--with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-mail_ssl_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with-http_perl_module=dynamic --with-http_xslt_module=dynamic --with-mail=dynamic --with-stream=dynamic --with-stream_geoip_module=dynamic
Nginx 源码编安装
#安装编译工具链
[root@ubuntu24 ~]# apt install -y make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev

#创建运行用户
[root@ubuntu24 ~]# useradd -r -s /usr/sbin/nologin nginx

#下载最新版源码并解压
[root@ubuntu24 ~]# wget https://nginx.org/download/nginx-1.26.2.tar.gz
[root@ubuntu24 ~]# tar xf nginx-1.26.2.tar.gz
[root@ubuntu24 ~]# cd nginx-1.22.1/

#编译安装
[root@ubuntu24 nginx-1.26.2]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

[root@ubuntu24 nginx-1.26.2]# make && make install

#修改目录属主属组并查看
[root@ubuntu nginx-1.26.2]# chown -R nginx:nginx /apps/nginx/
[root@ubuntu nginx-1.26.2]# ls -l /apps/nginx/
total 16
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 conf #配置文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 html #网站文件根目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 logs #日志文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 sbin #二进制程序目录

#创建软链接
[root@ubuntu nginx-1.26.2]# ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx
'/usr/sbin/nginx' -> '/apps/nginx/sbin/nginx'

#查看版本
[root@ubuntu24 nginx-1.26.2]# nginx -v
nginx version: nginx/1.26.2

[root@ubuntu24 /]# nginx -V
nginx version: nginx/1.24.0
built by gcc 13.2.0 (Ubuntu 13.2.0-23ubuntu4)
built with OpenSSL 3.0.13 30 Jan 2024
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

#默认没有服务脚本
[root@ubuntu24 ~]# systemctl status nginx
Unit nginx.service could not be found.

[root@ubuntu24 /]# ps aux | grep nginx
root        6309  0.0  0.0   6544  2304 pts/0    S+   09:33   0:00 grep --color=auto nginx

#直接启动nginx,一个master进程,一个 worker 进程
[root@ubuntu24 /]# nginx
[root@ubuntu24 /]# ps aux | grep nginx
root        6311  0.0  0.0  11368  1708 ?        Ss   09:33   0:00 nginx: master process nginx
nginx       6312  0.0  0.0  11796  2732 ?        S    09:33   0:00 nginx: worker process
root        6314  0.0  0.0   6544  2304 pts/0    S+   09:34   0:00 grep --color=auto nginx

#先将nginx停止,直接启动不能用systemctl 管理
[root@ubuntu24 /]# nginx -s stop

#创建PID 目录
[root@ubuntu24 /]# mkdir /apps/nginx/run
[root@ubuntu24 /]# chown -R nginx:nginx /apps/nginx/run/

#创建nginx服务脚本
[root@ubuntu24 /]# vim /usr/lib/systemd/system/nginx.server
:
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000


[Install]
WantedBy=multi-user.target

#修改配置文件,设置pid文件路径
[root@ubuntu24 ~]# cat /apps/nginx/conf/nginx.conf
pid   /apps/nginx/run/nginx.pid;

#重载服务脚本
[root@ubuntu24 ~]# systemctl daemon-reload 


#直接启动的 nginx 不能用 service 来管理
[root@ubuntu ~]# systemctl status nginx
○ nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: 
enabled)
     Active: inactive (dead)
       Docs: http://nginx.org/en/docs/
       
#用服务启动
[root@ubuntu ~]# systemctl start nginx

#查看状态
[root@ubuntu ~]# systemctl status nginx.service

#查看man手册
[root@ubuntu24 ~]# man nginx
No manual entry for nginx

#导入man手册
[root@ubuntu24 ~]# cp nginx-1.24.0/man/nginx.8 /usr/share/man/man8/
[root@ubuntu24 ~]# mandb

[root@ubuntu24 ~]# whereis nginx
nginx: /usr/sbin/nginx /usr/share/man/man8/nginx.8	#成功
Nginx 命令和信号
[root@ubuntu24 ~]# nginx -h
nginx version: nginx/1.24.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]

Options:
  -?,-h         : this help											#显示帮助信息
  -v            : show version and exit								#显示版本信息
  -V            : show version and configure options then exit		#显示版本信息和编译项
  -t            : test configuration and exit						#检查并测试配置文件
  -T            : test configuration, dump it and exit				#检查并测试配置文件,且输出配置文件内容
  -q            : suppress non-error messages during configuration testing		#在配置文件测试期间禁止显示非错误消息
  -s signal     : send signal to a master process: stop, quit, reopen, reload	#发送信号 stop|quit|reopen|reload
  -p prefix     : set prefix path (default: /apps/nginx/)			#指定运行目录,默认是 /apps/nginx/
  -e filename   : set error log file (default: logs/error.log)		#指定错误日志文件,默认是 logs/error.log
  -c filename   : set configuration file (default: conf/nginx.conf)	#指定配置文件,默认是 conf/nginx.conf
  -g directives : set global directives out of configuration file	#启动时指定一些全局配置项,而不用修改配置文件,格式为 k v
  
  
#信号说明
stop 		#立即停止,没处理完的请求也会被立即断开,相当于信号 SIGTERM,SIGINT
quit 		#优雅退出,不再接收新的请求,但己建立的连接不受影响,相当于信号 SIGQUIT
reopen 		#重开一个新的日志文件,日志内容写新文件,相当于信号 SIGUSR1 
reload 		#重新加载配置文件,重新生成worker 进程,不中断正在处理的请求,己建立的连接按旧配置处理,新连接用新配置处理	同systemctl reload nginx

SIGUSR2 	#平滑升级二进制文件,适用于版本升级 
SIGWINCH 	#优雅的停止工作进程,适用于版本升级
Nginx 平滑升级和回滚

Nginx 的平滑升级是指在不中断服务的情况下进行软件版本或配置文件的更新。通过平滑升级,Nginx  能够在运行时应用新的配置或软件版本,继续处理请求,而不影响现有的连接

平滑升级的主要优势在于,它允许 Nginx 在更新时保持对服务的连续响应,避免中断用户的请求,这对 于具有高可用性要求的生产环境非常重要,然而,需要注意的是,平滑升级并不适用于所有场景,特别 是在某些配置或软件更改可能导致不兼容性问题的情况下,在进行平滑升级之前,建议先在测试环境中 进行充分的测试

平滑升级通常包括以下步骤:

  • 新版本或配置准备:准备好新版本的 Nginx 可执行文件或配置文件,并确保它们没有问题

  • 新版本资源替换旧版本资源:进行资源替换,此步骤要备份旧版本资源,可以用作回滚

  • 发送信号:使用 nginx -s SIGUSR2,nginx -s reload 等方式向 Nginx 主进程发送重新加载的信号

  • 新的工作进程启动:Nginx 主进程接收到重新加载信号后,会启动新的工作进程,并使用新的配置 文件或软件版本

  • 平滑过渡:新的工作进程逐渐接管现有的连接。现有的连接会在旧的工作进程中继续处理,而新的 连接会由新的工作进程处理

  • 旧的进程退出:当旧的工作进程不再有活动连接时,它会被关闭

#下载新版本
[root@ubuntu24 ~]# wget https://nginx.org/download/nginx-1.26.2.tar.gz
[root@ubuntu24 ~]# tar -xf nginx-1.26.2.tar.gz
[root@ubuntu24 ~]# cd nginx-1.26.2/

#编译新版本
[root@ubuntu24 nginx-1.26.2]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module  --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

#只需要执行 make, 会在 objs 目录中生成新的二进制文件
[root@ubuntu24 nginx-1.26.2]# make

#新版二进制文件
[root@ubuntu24 nginx-1.26.2]# ./objs/nginx -v
nginx version: nginx/1.26.2

#现在使用的
[root@ubuntu24 nginx-1.26.2]# nginx -v
nginx version: nginx/1.24.0

#保留旧版二进制文件备份
[root@ubuntu24 ~]# mv /apps/nginx/sbin/nginx{,.124}
[root@ubuntu24 ~]# ls /apps/nginx/sbin/
nginx.124

#复制新的二进制文件
[root@ubuntu24 ~]# cp ./nginx-1.26.2/objs/nginx /apps/nginx/sbin/
[root@ubuntu24 ~]# ls /apps/nginx/sbin/
nginx  nginx.124

#检测,配置文件可用,版本己更新
[root@ubuntu24 ~]# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

[root@ubuntu24 ~]# nginx -v
nginx version: nginx/1.26.2

#当前进程是旧版本的进程
[root@ubuntu24 ~]# ps auxf | grep nginx
root       18928  0.0  0.0   6544  2304 pts/0    S+   11:00   0:00      \_ grep --color=auto nginx
root       15519  0.0  0.0  11368  1708 ?        Ss   10:25   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      15520  0.0  0.0  11796  3116 ?        S    10:25   0:00  \_ nginx: worker process

[root@ubuntu24 ~]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.24.0			#查看响应头,依然是旧版本的nginx
Date: Thu, 12 Sep 2024 03:01:06 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 12 Sep 2024 01:29:34 GMT
Connection: keep-alive
ETag: "66e243fe-267"
Accept-Ranges: bytes


#向master 进程发送信号
[root@ubuntu24 ~]# kill -USR2 15519

#生成了新的master 进程 18937,该进程下有一个 worker 进程,是 18938
[root@ubuntu24 ~]# ps auxf | grep nginx
root       18940  0.0  0.0   6544  2304 pts/0    S+   11:06   0:00      \_ grep --color=auto nginx
root       15519  0.0  0.0  11368  2220 ?        Ss   10:25   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      15520  0.0  0.0  11796  3116 ?        S    10:25   0:00  \_ nginx: worker process
root       18937  0.0  0.1  11372  6784 ?        S    11:06   0:00  \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      18938  0.0  0.0  11800  2600 ?        S    11:06   0:00      \_ nginx: worker process

#生成了新的PID文件
[root@ubuntu24 ~]# ls -lh /apps/nginx/run/
total 8.0K
-rw-r--r-- 1 root root 6 Sep 12 11:06 nginx.pid
-rw-r--r-- 1 root root 6 Sep 12 10:25 nginx.pid.oldbin

[root@ubuntu24 ~]# cat /apps/nginx/run/nginx.pid	#新的 master 进程 PID
18937
[root@ubuntu24 ~]# cat /apps/nginx/run/nginx.pid.oldbin		#旧的 master 进程 PID
15519

#现在访问还是旧版本提供服务
[root@ubuntu24 ~]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Thu, 12 Sep 2024 03:12:01 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 12 Sep 2024 01:29:34 GMT
Connection: keep-alive
ETag: "66e243fe-267"
Accept-Ranges: bytes

此时不关机保存一份快照,用于后续测试回滚

#服务端继续发送信号,此信号会关闭旧的 woker 进程,新请求交由新的 worker 进程处理
[root@ubuntu24 ~]# kill -WINCH 15519

#查看进程,旧的 master 进程
[root@ubuntu24 ~]# ps auxf | grep nginx
root       18973  0.0  0.0   6544  2304 pts/0    S+   11:16   0:00      \_ grep --color=auto nginx
root       15519  0.0  0.0  11368  2220 ?        Ss   10:25   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root       18937  0.0  0.1  11372  6784 ?        S    11:06   0:00  \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      18938  0.0  0.0  11800  2856 ?        S    11:06   0:00      \_ nginx: worker process

#新的连接己经由新版本来响应了
[root@ubuntu24 ~]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.26.2
Date: Thu, 12 Sep 2024 03:17:29 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 12 Sep 2024 01:29:34 GMT
Connection: keep-alive
ETag: "66e243fe-267"
Accept-Ranges: bytes

#观察一段时间后,如果业务没有问题,则可以继续发送信号,退出旧的 master 进程,至此升级完成
[root@ubuntu24 ~]# kill -QUIT 15519
[root@ubuntu24 ~]# ps auxf |grep nginx
root       18980  0.0  0.0   6544  2304 pts/0    S+   11:18   0:00      \_ grep --color=auto nginx
root       18937  0.0  0.1  11372  6784 ?        S    11:06   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      18938  0.0  0.0  11800  3112 ?        S    11:06   0:00  \_ nginx: worker process

如果是用 yum/apt 安装的nginx ,使用 yum/apt 升级时,无法实现平滑升级,但可以在一台新的机器 上安装新版,然后再平移新版的二进制文件到原机器,但要注意依赖库的兼容性和配置文件的兼容性

Nginx 配置

配置文件说明

#本系统使用的为apt安装的nginx的配置文件(与编译安装的不同)
[root@ubuntu24 ~]# ls -l /etc/nginx/
total 68
drwxr-xr-x 2 root root 4096 Mar 31 10:40 conf.d				#子配置文件目录,在主配置文件中被包含,默认为空
-rw-r--r-- 1 root root 1125 Dec  1  2023 fastcgi.conf		#FastCGI配置文件,定义相关配置项,被引用
-rw-r--r-- 1 root root 1055 Dec  1  2023 fastcgi_params		#FastCGI配置文件,定义相关配置项,被引用
-rw-r--r-- 1 root root 2837 Dec  1  2023 koi-utf			#用于转换KOI8-R编码的字符集到UTF-8
-rw-r--r-- 1 root root 2223 Dec  1  2023 koi-win			#用于转换KOI8-U编码的字符集到UTF-8
-rw-r--r-- 1 root root 5465 Dec  1  2023 mime.types			#包含文件扩展名和相应MIME类型的映射
drwxr-xr-x 2 root root 4096 Mar 31 10:40 modules-available	#模块配置文件目录
drwxr-xr-x 2 root root 4096 Mar 31 10:40 modules-enabled	#当前生效的模块配置文件目录,用软链接指向真正的文件
-rw-r--r-- 1 root root 1446 Dec  1  2023 nginx.conf			#主配置文件
-rw-r--r-- 1 root root  180 Dec  1  2023 proxy_params		#反向代理配置文件
-rw-r--r-- 1 root root  636 Dec  1  2023 scgi_params		#SCGI配置文件,SCGI和FastCGI类似,都是一种协议
drwxr-xr-x 2 root root 4096 Sep 10 20:20 sites-available	#所有域名配置文件
drwxr-xr-x 2 root root 4096 Sep 10 20:20 sites-enabled		#生效的域名配置文件,用软连接指向site-available中的文件
drwxr-xr-x 2 root root 4096 Sep 10 20:20 snippets			#通用的配置片段目录,需要时被引用
-rw-r--r-- 1 root root  664 Dec  1  2023 uwsgi_params		#配置 Nginx uWSGI 模块的默认参数的文件
-rw-r--r-- 1 root root 3071 Dec  1  2023 win-utf			#编码转换映射转化文件

Nginx 配置文件格式说明

  • 配置文件由指令与指令块构成

  • 每条指令以 ; 分号结尾,指令与值之间以空格符号分隔

  • 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐

  • 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块

  • include 语句允许组合多个配置文件以提升可维护性

  • 使用 # 号添加注释,提高可读性

  • 使用 $ 符号使用变量

  • 变量分为 Nginx 内置变量和自定义变量,自定义变量用 set 指令定义

  • 部分指令的参数支持正则表达式

全局配置

查看默认主配置文件内容

[root@ubuntu24 ~]# cat /etc/nginx/nginx.conf | grep -Ev "#|^$"
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
events {
	worker_connections 768;
}
http {
	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	ssl_prefer_server_ciphers on;
	access_log /var/log/nginx/access.log;
	gzip on;
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

#主配置文件有以下几部份组成
[root@ubuntu24 ~]# cat /etc/nginx/nginx.conf
#全局配置
......
......
#事件驱动相关的配置
events {
 ......
 ......
}

#http/https 协议相关配置段
http {
 ......
 ......
}

#mail 协议相关配置段, 此部份默认被注释
mail {
 
 ......
 ...... 
 server {
 ......
 ......
 }
}

# stream 协议相关配置,默认无此部份
stream {
 ......
 ......
}

全局配置

全局配置段常见的配置指令分类

  • 正常运行必备的配置

  • 优化性能相关的配置

  • 用于调试及定位问题相关的配置

  • 事件驱动相关的配置

#全局配置常用配置项
user user [group]; #指定worker 进程运行时的用户和组,默认值为 nobody nobody

worker_processes auto|N; #指定启动的 worker 进程数量,N 表示具体数字,auto 表示有几个CPU核心就开启几个进程
worker_cpu_affinity auto|cpumask; #将worker进程绑定到指定的CPU核心,提升性能,默认不绑定,
 		# auto 表示自动绑定,nginx 1.9.10 版本开始支持
		#cpumask 写法
		#有几颗CPU核就写几个数字,默认是0,表示占位符,从右往左数,如果占位符值为1,则表示绑定
 		# worker_processes 4;
		# worker_cpu_affinity 0001 0010 0100 1000;
		# 上述写法表示4个工作进程分别绑定到 0,1,2,3 这4个CPU核心上
		# worker_processes 2;
		# worker_cpu_affinity 0101 1010;
		# 上述写法表示2个工作进程分别绑定到 0/2,1/3 CPU核心上

pid /path/file; #pid 文件路径,该文件中保存的是 master 进程号,服务启动时自动生成该文件

worker_priority N; #worker 进程优先级,默认值为0,此处设定的是 nice 值,取值为 -20 到 19

worker_rlimit_nofile N; #所有worker进程可以打开的文件描述符数量之和,默认不限制
 		#此值并不仅仅是指nginx 与客户端的连接数,也包括与后端服务的连接数
 		#比如一个客户端请求一个PHP资源,Nginx要维持与客户端连接,也要维持后端FastCGI连接
 		
daemon on|off; #默认值为on, 表示以后台守护进程方式运行,off 表示前台运行
 		
master_process on|off; #默认值为on, 表示以 master-worker 模式运行,off 只有master 进程,用于开发调试

include /path/file; #文件包含,指定要包含的文件路径及规则,可以使用通配符

#evnets 配置项
events {
       worker_connections N; #默认值512,单个worker进程所支持的最大并发连接数,总的并发数用此值乘以worker 进程数
       multi_accept on|off; #默认值 off,on 表示worker 进程一次可以接收多个新的连接请求,off 表示 worker 进程 
       						#一次只能接收一个新连接,建议设置为 on
        
       accept_mutex on|off; #默认值 off,表示master 进程获得客户端请求后,会通知所有的 worker 进程,由当前状态 
							#最佳的worker 进程处理请求,此过程也被称为 惊群,on 表示 master 进程论流给 worker
       						#进程分配要处理的连接,此处建议设置为 on
        
       use method; #指定事件驱动模型,默认不设置此项,nginx 会根据当前系统自行选择
       #可用值select|pool|kqueue|epoll|/dev/poll|eventport
}

http 配置

http 配置

在 Nginx 的配置文件中, http 指令用来配置 HTTP 服务器的全局设置和参数, http 配置段中包括 http 的全局配置,多个 location 配置,多个 server 配置等,其中 server 用来配置虚拟主机

#主配置文件中的 http 配置部份
[root@ubuntu24 ~]# cat /etc/nginx/nginx.conf
...
...
http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;		#引用其它配置文件,此目录默认为空
	include /etc/nginx/sites-enabled/*;		#虚拟主机配置,每个虚拟主机一个文件
}


#http 配置中的常用配置项
charset charset|off; 		#是否在响应头 Content-Type 行中添加字符集,默认 off,
charset utf8				#可以添加上utf8,指定字符集编码解析,可以防止乱码

sendfile on|off; 			#默认值 off,on表示使用 sendfile 函数来传送数据,即零拷贝

tcp_nopush on|off; 			#默认值 off,表示有tcp数据了立即发送,on 表示等到数据包满载了再发送
 							#on 要配合 sendfile on 一起使用
 							
tcp_nodelay on|off; 		#此选项生效前提是开启了 keepalived,默认值 on 表示立即发送数据,off 表示延时 
							#0.2S发送数据

keepalive_timeout timeout [header_timeout]; 	#会话保持的时长,单位为秒,第二个值会出现在响应头中,可以和第一个值不一样
 
types_hash_max_size N; 		#默认值1024,用于设置 MIME 类型哈希表大小,
 							#Nginx 使用 MIME 类型哈希表来加速 MIME 类型的查找过程,提高性能
 
server_tokens on|off|build|string; 		#默认值on,表示在响应头中显示 nginx 版本信息,off 表示不显示
 										#build 表示显示的是编译时设置的值 --build=name, 1.11.10 版本开始支持
 			#string 指自定义字符串,商业版中支持server_names_hash_bucket_size N; 
 			#默认值32|64|128,默认值具体取决于服务器缓存大小,
 			#此项用于设置服务器名哈希桶大小,当配置了大量虚拟主机时,此项可用来提升性能
 
server_name_in_redirect on|off; 	#默认值off,表示在重定向时响应头中不包含 Server行,on 表示显示 Server 头

include /etc/nginx/mime.types; 		#规定了各种后缀的文件在响应报文中的 Content-Type 对应的值

default_type application/octet-stream; 	#除了上述映射外,其它类型文件都用此值

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; #当前nginx 可支持的 ssl协议版本
 					#默认值 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3
 					
ssl_prefer_server_ciphers on|off; 	#默认off,表示在 SSL/TLS 握手时优先使用客户端加密套件,on表示优先使用服务端套件

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
 			#访问日志的文件路径、格式以及其他一些选项
 			#默认值 logs/access.log combined, 禁用访问日志可以写成 access_log off;
 			#path 指定文件路径
			#format 指定日志格式,不指定格式则使用预定义的combined
 			#buffer=size 设置缓冲区大小,可以异步写
			#gzip[=level] 启用gzip压缩,可以指定压缩比
			#if=condition 设置条件,仅在满足时记录日志
error_log file [level]; #指定错误日志路径和错误级别,默认值 error_log logs/error.log error;
 						#可用级别包括ebug|info|notice|warn|error|crit|alert|emerg
 
error_page code ... [=[response]] uri; 	#定义指定状态码的错误页面,可以多个状态码共用一个资源

gzip on|off; 			#是否使用gzip 压缩数据后再传输,默认off

gzip_vary on|off; 		#在启用了压缩的情况下,是否在响应头中添加 Vary: Accept-Encoding 行,默认off

gzip_proxied off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any ...;
 						#是否对后端服务器的返回结果进行压缩,默认 off
gzip_comp_level N; 		#设置压缩比,取值1-9,默认 1
gzip_buffers number size; #设置用于gzip压缩的缓存空间大小,用 number * size,默认值 32 4k|16 8k
 						#size 取值为系统内存页大小,与当前操作系统和平台有关
gzip_http_version N; 	#用于设置开启gzip 压缩的http 协议的早小版本,默认值 1.1,因为有些客户端或浏览器不支持gzip压缩
gzip_types mime-type ...; 	#根据响应资源的 MIME 来决定是否对数据进行压缩,默认值 text/html

server 配置

server 主要用来配置虚拟主机,可以在一台 web 服务器上支持多个域名

[root@ubuntu24 ~]# cat /etc/nginx/sites-enabled/default

listen address[:port] [default_server] [ssl];
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl]; 
	#当前虚拟主机监听的ip,port,是否是default_server,是否支持ssl 等
	#默认值 *:80|*:8000; 可以写多条

ssl_certificate file;		#当前虚拟主机证书和CA机构证书,放在一个文件中,默认值为空

ssl_certificate_key file;	#私钥文件路径,默认为空

ssl_session_cache off|none|[builtin[:size]] [shared:name:size];
	#是否启用 ssl 缓存,默认none
	#off 不使用 ssl 缓存
	#none 通知客户端,当前支持 ssl session cache
	#builtin[:size] 使用 openssl 内建缓存,为每个worker 进程私有
	#shared:name:size woker 进程共享缓存

ssl_session_timeout N; 		#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

ssl_ciphers ciphers; 	#指定 SSL/TLS 加密算法,默认值HIGH:!aNULL:!MD5;
						#默认值表示加密优先级高,排除匿名加密算法,排除 MD5 加密算法

ssl_prefer_server_ciphers on|off; 	#默认off,表示在SSL/TLS握手时优先使用客户端加密套件,on表示优先使用服务端套件

root path; 				#当前虚拟主机网页文件目录,写在location中,文件路径是 root+location

index file ...; 		#当前虚拟主机的默认页面,可以写多个,按顺序生效,默认 index.html

server_name name ...; 	#虚拟主机域名,可以写多个值,客户端请求头中的 Host 字段会与此处匹配
						#默认值是"",用来匹配请求头中 Host 字段值为空的请求
						#还可以写成 _,@ 等用来表示无效域名,和listen中的default_server配合

location 配置

一个 server 配置段中可以有多个 location 配置,用于实现从 uri 到文件系统的路径映射,Ngnix 会根据 用户请求的 uri 来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置

location 指令作用于 server 配置段中,也可以嵌套

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

#配置段匹配规则
= 		#用于标准uri前,需要请求字串与uri精确匹配,区分大小写
^~ 		#用于标准uri前,表示包含正则表达式,匹配以特定字符串开始,区分大小写
~ 		#用于标准uri前,表示包含正则表达式,区分大小写
~* 		#用于标准uri前,表示包含正则表达式,不区分大写
/str 	#不带符号 匹配以 str 开头的 uri,/ 也是一个字符
\ 		#用于标准uri前,表示包含正则表达式并且转义字符,可以将 . * ?等转义为普通符号
@name 	#定义

#匹配规则优先级
=, ^~, ~/~*, /str


#常用配置项
alias path; 		#定义路径别名,把访问路径重新映射到其它目录,此指令仅用于 location 中,与 root 有本质区别
root path; 			#定义网站在文件系统上的家目录,写在location中,文件的绝对路径等于外层server 中定义的 root+location
index file ...; 	#当前配置段的默认页面,可以写多个,依次生效,默认 index.html
return code [text]|code URL|URL; 	#直接给客户端返回状态码+字符串或URL,此指令后的其它指令都不再生效
proxy_pass URL; 	#设置反向代理,将符合规则的请求转发到后端服务器进行处理
fastcgi_pass address; 				#通过fastCGI协议将请求转发到后端服务器进行处理,可以写在 ip:port 或 unix:/socekt
fastcgi_index name; 				#fastCGI协议的默认资源,默认为空
fastcgi_param parameter value [if_not_empty]; 	#设置传给fastCGI服务器的参数 key val 格式
deny address|CIDR|unix:|all; 		#拒绝访问的客户端,黑名单,可以是具体IP,网段,socket(1.5.1版本以上),所有
allow address|CIDR|unix:|all; 		#允许访问的客户端,白名单,可以是具体IP,网段,socket(1.5.1版本以上),所有
 					#deny 和 allow 指令同时存在时,按加载顺序生效 
                                
try_files file ... uri|file ... =code; 			#按顺序查询文件是否存在,返回第一个匹配到的,如果没有匹配到,会内部重定向到最后一个参数

多虚拟主机实现

多虚拟主机是指在一台 Nginx 服务器上配置多个网站

在 Nginx 中,多虚拟主机有三种实现方式:

  • 基于IP地址实现多虚拟主机

  • 基于端口号实现多虚拟主机

  • 基于域名实现多虚拟主机:

基于域名实现多虚拟主机

在 Nginx 中配置多个 server 段,每个 server 中设置一个虚拟主机配置,客户端访问服务器时,会根据 客户端请求头中的 Host 字段值来匹配 server 段中的配置,从而访问不同的网站

[root@ubuntu24 ~]# cd /etc/nginx/sites-enabled/

#添加配置文件
[root@ubuntu24 sites-enabled]# cat www.a30
server{

  listen 80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;

}

server{

  listen 80;
  server_name www.a30.net;
  root /var/www/html/www.a30.net;

}
#修改默认页面,创建网站目录和首页
[root@ubuntu24 ~]# mkdir /var/www/html/www.a30.com
[root@ubuntu24 ~]# echo "www.a30.com 好好嗷嗷好哈" > /var/www/html/www.a30.com/index.html

[root@ubuntu24 ~]# mkdir /var/www/html/www.a30.net
[root@ubuntu24 ~]# echo "www.a30.net 哈哈哈哈哈哈哈哈哈" > /var/www/html/www.a30.net/index.html

[root@ubuntu24 ~]# tree /var/www/html/
/var/www/html/
├── index.html
├── index.nginx-debian.html.bak
├── www.a30.com
│   └── index.html
└── www.a30.net
    └── index.html

3 directories, 4 files

#测试配置文件并重新加载服务
[root@ubuntu24 ~]# nginx -t
[root@ubuntu24 ~]# systemctl reload nginx.service
基于IP地址实现多虚拟主机
#添加IP
[root@ubuntu24 ~]# ip a a 10.0.0.110 dev eth0
[root@ubuntu24 ~]# ip a a 10.0.0.120 dev eth0

[root@ubuntu24 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1e:65:08 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    altname ens33
    inet 10.0.0.157/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.110/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.120/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe1e:6508/64 scope link
       valid_lft forever preferred_lft forever
       
#为域名绑定不同的IP    
[root@ubuntu24 sites-enabled]# cat www.a30
server{

  listen 10.0.0.110:80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;

}

server{

  listen 10.0.0.120:80;
  server_name www.a30.net;
  root /var/www/html/www.a30.net;

}
#客户端修改hosts 文件并测试
基于端口号实现多虚拟主机
#服务器上所有IP 的81,82端口都会被规则匹配
[root@ubuntu24 sites-enabled]# cat www.a30
server{

  listen 81;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;

}

server{

  listen 82;
  server_name www.a30.net;
  root /var/www/html/www.a30.net;

}
#客户端修改hosts 文件并测试

location 指令使用

root 与 alias
#root指令用于指定网站根目录
[root@ubuntu24 ~]# vim /etc/nginx/sites-enabled/www.a30
server{

  listen 80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;
}
#alias 定义路径别名,将访问请求映射到其它路径,只能写在 location 中
[root@ubuntu24 ~]# mkdir /data
[root@ubuntu24 ~]# echo "alias 的访问路径" > /data/index.html
[root@ubuntu24 ~]# vim /etc/nginx/sites-enabled/www.a30
server{

  listen 80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;

location /about {
  alias /data;#访问 http://www.a30.com/about 被此规则命中,其它目录不受此规则影响
}
#客户端执行映射地址为/data/index.html

#location 中的 root
[root@ubuntu24 sites-enabled]# mkdir -pv /data/about/
[root@ubuntu24 ~]# echo "root 的访问路径" > /data/about/index.html
[root@ubuntu24 ~]# vim /etc/nginx/sites-enabled/www.a30
server{

  listen 80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;

location /about {
  root /data;#访问 http://www.a30.com/about 被此规则命中,其它目录不受此规则影响
}
#客户端执行映射地址为/data/about/index.html

#如果 uri 中没有 about,则不会被此规则匹配
location 规则优先级
#匹配规则优先级
=, ^~, ~/~*, /str

[root@ubuntu24 sites-enabled]# cat www.a30
server{

  listen 80;
  server_name www.a30.com;
  root /var/www/html/www.a30.com;
  
  location = / { 					#精确匹配 /
 	default_type text/html;
 	return 200 'location = /';
}
 location / { 						#匹配以 /开始
 	default_type text/html;
 	return 200 'location /';
}
location /documents/ { 				#匹配以 /document/ 开始,区分大小写
 	default_type text/html;
 	return 200 'location /documents/';
}
location ^~ /images/ { 				#匹配以 /images/ 开始,区分大小写
 	default_type text/html;
 	return 200 'location ^~ /images/';
}
location ~* \.(gif|jpg|jpeg)$ { 	#匹配以 .gif .jpg .jpeg 结尾,不区分大小写
 	default_type text/html;
 	return 200 'location ~* \.(gif|jpg|jpeg)';
}

#示例
[root@ubuntu24 sites-enabled]# curl www.a30.com/	#精确匹配 /
location = /
[root@ubuntu24 sites-enabled]# curl www.a30.com		#精确匹配 /
location = /
[root@ubuntu24 sites-enabled]# curl www.a30.com/asd	#匹配以 / 开头
location /
[root@ubuntu24 sites-enabled]# curl www.a30.com/documents/	#匹配以 /documents 开头
location /documents/
[root@ubuntu24 sites-enabled]# curl www.a30.com/images	#匹配以 / 开头
location /
[root@ubuntu24 sites-enabled]# curl www.a30.com/images/	#匹配以 /images/ 开头
location ^~ /images/
[root@ubuntu24 sites-enabled]# curl www.a30.com/imageS/	#匹配以 / 开头
location /
[root@ubuntu24 sites-enabled]# curl www.a30.com/images/a.jpg	#匹配以 /images/ 开头,^~ 优先级更高
location ^~ /images/
[root@ubuntu24 sites-enabled]# curl www.a30.com/imagesa/a.jpg	#匹配结尾,不区分大小写
location ~* \.(gif|jpg|jpeg)
  • 44
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值