厚积薄发,静水流深,今天介绍nginx的一些使用

基本配置文件

 1 # 工作进程, 启动nginx时启动多少个进程
 2 worker_processes  auto;
 3 ​
 4 # 事件驱动模块
 5 events {
 6     # 每个work可以创建多少个连接
 7     worker_connections  1024;
 8 }
 9 ​
10 ​
11 http {
12     # 引入外部文件, mime.types : 文件类型的对应关系, 告诉客户端(浏览器)以什么方式打开文件, 如果没有对应关系, 则会弹出下载提示框
13     # /etc/nginx/mime.types 文件中定义了各种文件扩展名对应的 MIME 类型
14     include       /etc/nginx/mime.types;
15     # 默认 MIME 类型当找不到匹配的 MIME 类型时使用
16     # application/octet-stream 表示未知文件类型的二进制流
17     default_type  application/octet-stream;
18 ​
19     # 是否开启数据零拷贝, 以提高静态文件传输效率
20     # sendfile 指令打开时Nginx 会直接从内核缓存读取文件提高性能
21     sendfile        on;
22 ​
23     # 设置 keepalive 超时时间
24     keepalive_timeout  65;  
25     # 指定客户端与服务器之间的空闲连接保持时间为 65节省资源
26     
27 ​
28     # 虚拟主机配置
29     server {
30         # 监听 80 端口HTTP 默认端口
31         listen       80;
32         
33         # 设置服务器名称, server_name 指定服务器的主机名这里是 localhost
34         server_name  localhost;
35         
36         # 配置静态文件访问
37         location /wwjfiles/ {
38             #  /wwjfiles/ 请求映射到服务器根目录 /
39             # 例如请求 /wwjfiles/file.txt 实际会访问服务器根目录下的 /wwjfiles/file.txt 文件
40             root /;  # 映射请求路径到实际文件路径
41             
42             # 开启目录浏览功能
43             autoindex on;  
44             # autoindex on如果访问的路径是目录而没有 index 文件Nginx 会生成该目录的文件列表页面
45         }
46         
47         # 根路径的请求处理
48         location / {
49             # 将请求的根路径映射到 /usr/share/nginx/html 目录
50             root   /usr/share/nginx/html;  
51             # 请求 /会访问 /usr/share/nginx/html目录下的文件
52 ​
53             # 默认的首页文件设置
54             index  index.html index.htm;  
55             # 当访问根路径时Nginx 会查找 index.html index.htm 文件来响应请求
56         }
57         
58         # 错误页面的自定义设置
59         error_page   500 502 503 504  /50x.html;  
60         # 如果出现 500, 502, 503 504 错误Nginx 会显示 /50x.html 页面
61         
62         # 定义具体的错误页面响应处理
63         location = /50x.html {
64             # 设置错误页面的实际路径
65             root   /usr/share/nginx/html;  
66             # 500 系列错误页面将显示 /usr/share/nginx/html/50x.html 文件的内容
67         }
68     }
69 ​
70     # 可选引入其他服务器配置文件
71     # include /etc/nginx/conf.d/*.conf;
72     # 使用 include 指令引入 /etc/nginx/conf.d 目录下的所有 .conf 文件,实现模块化配置。
73 }

hosts文件配置域名解析

服务器已经安装了nginx, 并且监听80端口:

 1 # 虚拟主机配置
 2 server {
 3 ​
 4     listen       80;
 5     server_name  localhost;
 6     
 7     location /wwjfiles/ {
 8         root /;
 9     }
10 }

如果在服务器的hosts文件中配置了域名, 那么请求网络资源时, 首先会去hosts文件中查找是否有该域名的对应IP, 如果有, 直接请求该路径, 如果没有, 再去请求公共的DNS查询IP

例如, 在服务器的hosts文件中追加该配置:

然后使用 curl tcwwjdr/wwjfiles/ip.txt 测试请求, 直接拿到了/wwjfiles目录下的ip.txt文件

虚拟主机原理

Nginx 的虚拟主机是一种技术,通过一个物理服务器运行多个网站或应用程序。这可以通过共享一个 IP 地址来实现,也可以通过使用不同的 IP 地址和端口进行区分。

Nginx 支持三种类型的虚拟主机:基于域名的虚拟主机、基于 IP 的虚拟主机和基于端口的虚拟主机。

基于域名的虚拟主机

基于域名的虚拟主机是 Nginx 最常用的一种虚拟主机方式。当服务器根据客户端的请求头中的 Host 字段来选择具体服务的站点时,就会使用这种方式。

工作原理

  • 请求到达服务器时,Nginx 根据 Host 字段来匹配相应的虚拟主机配置。
  • 当用户通过浏览器访问一个网站时,浏览器会在 HTTP 请求头中包含一个 Host 字段,该字段表示用户访问的具体域名。
  • Nginx 使用的配置是 server_name 字段,用来指定服务哪个域名。

示例

 1 # 虚拟主机1服务域名为 www.example.com
 2 server {
 3     listen 80;
 4     server_name www.example.com;
 5     
 6     location / {
 7         root /var/www/example1;
 8         index index.html;
 9     }
10 }
11 ​
12 # 虚拟主机2服务域名为 www.test.com
13 server {
14     listen 80;
15     server_name www.test.com;
16     
17     location / {
18         root /var/www/example2;
19         index index.html;
20     }
21 }

解释

  • listen 80;:监听服务器的80端口,这是HTTP的默认端口。
  • server_name:指定虚拟主机的域名,如 www.example.comwww.test.com
  • location /:定义根路径下的资源处理方式,如将请求指向特定的目录。
  • Nginx 会根据客户端请求中的 Host 头部匹配到对应的 server 块,从而为不同的域名提供不同的内容。

通配符匹配

监听所有以example.com结尾的请求:

 1 # 虚拟主机1服务域名为 *.example.com
 2 server {
 3     listen 80;
 4     server_name *.example.com;
 5     
 6     ...
 7 }

监听所有以www.example开头的请求:

 1 # 虚拟主机1服务域名为 *.example.com
 2 server {
 3     listen 80;
 4     server_name www.example.*;
 5     
 6     ...
 7 }

正则匹配

 1 # 虚拟主机1服务域名为 *.example.com
 2 server {
 3     listen 80;
 4     # 正则匹配使用 ~ 前缀来指定
 5     server_name ~^[0-9]+.mmban.com$;
 6     
 7     ...
 8 }

基于端口的虚拟主机

基于端口的虚拟主机是通过为不同的应用分配不同的端口来实现的。可以在同一台服务器上,使用不同的端口号提供不同的网站或应用。

工作原理

  • 请求到达服务器时,Nginx 根据端口号来选择处理的虚拟主机。
  • Nginx 配置多个 server 块,每个 server 块监听不同端口号。

示例

 1 # 虚拟主机1监听80端口
 2 server {
 3     listen 80;
 4     
 5     ...
 6 }
 7 ​
 8 # 虚拟主机2监听8080端口
 9 server {
10     listen 8080;
11     
12     ...
13 }

解释

  • listen 80;listen 8080;:分别监听服务器的80和8080端口。
  • 每个 server 块监听不同的端口号提供不同的服务。

基于 IP 的虚拟主机—了解

基于 IP 的虚拟主机方式较少使用,它依赖于为每个虚拟主机(网站或应用)分配一个独立的 IP 地址。通过服务器监听不同的 IP 地址,来为不同的 IP 提供不同的网站服务。

工作原理

  • Nginx 配置多个 server 块,每个 server 块监听不同的 IP 地址。
  • 当请求到达服务器时,Nginx 会根据请求的目标 IP 地址来选择服务的站点。

示例

 1 # 虚拟主机1监听 192.168.1.10
 2 server {
 3     listen 192.168.1.10:80;
 4     
 5     location / {
 6         root /var/www/example1;
 7         index index.html;
 8     }
 9 }
10 ​
11 # 虚拟主机2监听 192.168.1.11
12 server {
13     listen 192.168.1.11:80;
14     
15     location / {
16         root /var/www/example2;
17         index index.html;
18     }
19 }

解释

  • listen 192.168.1.10:80;:服务器监听 192.168.1.10 IP 地址的 80 端口。
  • 每个 server 块提供不同的内容,具体取决于目标 IP 地址。

反向代理

代理和反向代理

 1代理(正向代理)是代表客户端向服务器发送请求的中介常用于隐藏客户端的真实IP地址或提供缓存服务
 2反向代理与代理相反它代表服务器接收客户端请求可以实现负载均衡SSL终端等功能
 3
 4简单来说代理用于替代请求而反向代理用于保护和优化服务器
 5正向代理和反向代理都需要可以通过nginx来实现, 具体是哪个, 需要通过用途来区分, 隐藏服务器就是方向代理, 隐藏客户端就是正向代理

请求转发

URL匹配转发

需要在server块下的location里配置proxy_pass, 和root选项是二选一, 只会有一个生效

如下配置, 会将所有80的请求全部转发到192.168.0.113:8080, 例如请求192.168.0.113:80/test/test, 服务器会转发到192.168.0.113:8080/test/test

 1server {
 2    listen       80;
 3    server_name localhost;
 4
 5    location / {
 6        # 所有80的请求全部转发到192.168.0.113:8080
 7        proxy_pass http://192.168.0.113:8080;
 8    }
 9}

URL匹配替换再转发

 1server {
 2    listen       80;
 3    server_name localhost;
 4    
 5    location ~ ^/api/(.*)$ {  # 使用正则表达式匹配 /api/ 开头的请求
 6        rewrite ^/api/(.*)$ /$1 break;  #  /api/xxx 路径重写为 /xxx
 7        proxy_pass http://192.168.0.113:8080;
 8        proxy_set_header Host $host;  # 设置 Host
 9        proxy_set_header X-Real-IP $remote_addr;  # 转发客户端真实 IP
10        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 添加转发的 IP
11        proxy_set_header X-Forwarded-Proto $scheme;  # 添加协议类型
12    }
13}
 1说明:
 2    1, ~ 表示正则表达式匹配
 3    2, ^/api/(.*)$ 匹配 /api/ 后的任何内容
 4    3, /$1 是正则表达式中的捕获组 rewrite 指令中$1 代表匹配正则表达式括号中的第一个捕获组例如上例中, ^/api/(.*)$ 这个正则表达式匹配以 /api/ 开头的 URL其中 (.*) 表示捕获任意字符并放入第一个捕获组
 5    4, proxy_set_header Host $host;
 6        作用修改转发请求的 Host 头部
 7        含义将客户端请求中的 Host 头部信息传递给后端服务器$host Nginx 内置的变量表示请求中的主机名通常是域名)。这对于后端服务器识别请求的原始域名非常重要
 8    5, proxy_set_header X-Real-IP $remote_addr;
 9        作用将客户端的真实 IP 地址传递给后端服务器
10        含义$remote_addr 是客户端的真实 IP 地址Nginx 会把它写入 X-Real-IP 头部这样后端服务器就可以获取到发起请求的真实客户端 IP 地址
11    6, proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
12        作用 X-Forwarded-For 头部中记录请求经过的 IP 地址
13        含义X-Forwarded-For 是一个标准的 HTTP 头部用来记录客户端的原始 IP 地址以及经过的所有代理服务器的 IP 地址$proxy_add_x_forwarded_for 是一个特殊的 Nginx 变量它会在原有的 X-Forwarded-For 值后面添加当前请求的 IP 地址
14    7, proxy_set_header X-Forwarded-Proto $scheme;
15        作用将请求的协议类型传递给后端服务器
16        含义$scheme Nginx 的内置变量表示客户端使用的协议http https)。通过在 X-Forwarded-Proto 头部中传递这个值后端服务器可以知道请求是通过 HTTP 还是 HTTPS 发送的

负载均衡

负载均衡是一种分配网络流量到多个服务器的技术,以提高性能和可用性。其主要目的是防止单个服务器过载,从而提高系统的可靠性和响应速度。

使用负载均衡可以提高系统的可扩展性和故障恢复能力,常见于高流量网站和应用中。

负载均衡通常通过以下几种方式实现:

  1. 轮询:将请求依次分配给每台服务器,简单易实现,但对每台服务器的负载无法考虑。
  2. 最少连接:将请求发送到当前连接数最少的服务器,适用于连接持续时间不均匀的情况。
  3. 加权轮询:为每台服务器分配权重,根据权重轮询分配请求,适用于性能差异明显的服务器。
  4. IP哈希:根据客户端IP地址计算哈希值,将请求分配到特定服务器,确保同一客户端总是连接到同一台服务器。
  5. 健康检查:负载均衡器定期检查各个服务器的状态,确保只有健康的服务器接收请求。

轮询

nginx配置, 所有请求192.168.0.113:80/test/test会被负载均衡到 192.168.0.113:8080/tset/test 和192.168.0.118:8080/tset/test

 1upstream target {
 2    server 192.168.0.113:8080;
 3    server 192.168.0.118:8080;
 4}
 5server {
 6    listen       80;
 7    server_name localhost;
 8
 9    location / {
10        proxy_pass http://target;
11    }
12}

权重

权重, 10次中, 差不多有8次访问113, 差不多有2次机会访问118

这个 8次 和 2次 并不是绝对精准的,而是大致的比例。Nginx 的负载均衡是基于权重的概率分配,而不是严格按照每 10 次请求一定有 8 次发送到 192.168.0.113,2 次发送到 192.168.0.118

 1upstream target {
 2    server 192.168.0.113:8080 weight=8
 3    server 192.168.0.118:8080 weight=2
 4}
 5
 6...

不常用—down

服务下线, 不可用, 如下配置, 服务不会经过 113 和 115 :

 1upstream target {
 2    server 192.168.0.113:8080 weight=8 down
 3    server 192.168.0.115:8080 down
 4    server 192.168.0.118:8080 weight=2
 5    server 192.168.0.120:8080 weight=3
 6}
 7
 8...

不常用—backup

如下配置, 120备用服务器, 当113 和 118 都不可用时(比如宕机或出现故障),请求才会被转发到 120 :

 1upstream target {
 2    server 192.168.0.113:8080 weight=8
 3    server 192.168.0.118:8080 weight=2
 4    server 192.168.0.120:8080 backup
 5}
 6
 7...

静态文件

通过nginx转发到指定目录下获取静态资源

静态文件配置

 1# 使用 root
 2location /wwjfiles {
 3    root /; # 请求 /wwjfiles/logo.png 被解析为 /wwjfiles/logo.png
 4}
 5
 6# 使用 alias
 7location /wwjfiles {
 8    alias /; # 请求 /wwjfiles/logo.png 被解析为 /logo.png , 该配置下想访问 /wwjfiles/logo.png, 需要请求 /wwjfiles/wwjfiles/logo.png
 9}

正则表达式配置

如下配置, 静态资源(js/css/图片)都直接从 目录 /html里获取, 接口转发到 192.168.0.113:8080 服务

 1server {
 2    listen       80;
 3    server_name localhost;
 4
 5    # 配置静态文件访问
 6    location /js {
 7        #  /js 请求映射到服务器目录 /html/js
 8        root /html;
 9    }
10
11    # 配置静态文件访问
12    location /css {
13        #  /css 请求映射到服务器目录 /html/css
14        root /html;
15    }
16
17    # 配置静态文件访问
18    location /img {
19        #  /img 请求映射到服务器目录 /html/img
20        root /html;
21    }
22}

使用正则配置前面的动静分离配置

 1server {
 2    listen       80;
 3    server_name localhost;
 4
 5    # 配置静态文件访问
 6    # ~表示开始正则匹配
 7    # *表示不区分大小写
 8    # /(js|css|img): 这是正则表达式表示 URI 中包含 jscss img 的请求都会被匹配到| 是逻辑操作符
 9    location ~*/(js|css|img) {
10        #  /js 请求映射到服务器目录 /html
11        root /html;
12    }
13}

URL Rewrite

  • 在Nginx中,URL重写(Rewrite)功能常用于修改客户端请求的URL路径,可以将请求重定向到另一个URL,或者根据需要修改URL的某些部分。
  • Nginx的URL重写主要依赖于rewrite指令,结合正则表达式进行URL匹配和重写。重写机制主要分为内部重写(rewrite)和外部重定向(return或redirect)。

内部重写(rewrite指令)

内部重写意味着在Nginx内部改变请求的URL,而不会通知客户端,最终返回的资源仍然来自新的URL。Nginx会匹配到新的URL,并根据新的URL继续处理请求。

基本语法

 1rewrite <正则表达式> <替换后的URL> [flag]
  • <正则表达式>:用于匹配原始URL的正则表达式。
  • <替换后的URL>:匹配成功后的URL替换内容。
  • [flag]:控制rewrite行为的标志,比如lastbreak等。

常见的flag

  • last:终止当前location块的处理,使用新的URL重新开始匹配location
  • break:停止重写过程并继续处理剩下的请求。

示例 1: 简单URL重写

假设你想将/blog/开头的请求重写到/news/路径。

 1server {
 2    listen 80;
 3    server_name example.com;
 4
 5    location / {
 6        rewrite ^/blog/(.*)$ /news/$1 last;
 7    }
 8}

解释:

  • ^/blog/(.*)$:匹配以/blog/开头的URL,(.*)匹配剩余部分。
  • /news/$1:将匹配到的URL部分重写为/news/$1代表正则中的第一个捕获组,即原始URL的(.*)部分。

例子:

  • 请求http://example.com/blog/tech/ 会被重写为http://example.com/news/tech/
  • 请求http://example.com/blog/sports/ 会被重写为http://example.com/news/sports/

示例 2: 根据条件重写URL

使用条件判断来有选择性地进行重写,例如当客户端的User-Agent是手机设备时,重写URL到移动版页面。

 1server {
 2    listen 80;
 3    server_name example.com;
 4
 5    if ($http_user_agent ~* "Mobile") {
 6        rewrite ^/$ /mobile/ last;
 7    }
 8}

解释:

  • $http_user_agent:代表客户端的User-Agent头信息。
  • ~* "Mobile":表示不区分大小写地匹配包含”Mobile”的User-Agent。

例子:

  • 如果用户使用手机浏览器访问http://example.com/,它会被重写为http://example.com/mobile/
  • 如果用户使用桌面浏览器,则不会进行URL重写。

外部重定向(return或rewrite带redirect)

外部重定向意味着服务器会告诉客户端URL已改变,并让客户端自行发起新的请求。通常这会伴随着HTTP 301302状态码。

rewrite带redirect, rewrite指令也可以通过redirect标志触发外部重定向。

示例 1: 301永久重定向

/old-page的请求永久重定向到/new-page

 1server {
 2    listen 80
 3    server_name example.com
 4
 5    location / {
 6        rewrite ^/old-page$ /new-page permanent
 7    }
 8}

解释:

  • ^/old-page$:精确匹配/old-page路径。
  • /new-page:重定向到/new-page
  • permanent:返回301 Moved Permanently状态码,表示URL的永久变更。

例子:

  • 请求http://example.com/old-page 会被重定向为http://example.com/new-page,并返回301状态码。

示例 2: return指令实现302临时重定向

return指令也可用于实现重定向,例如临时重定向(302),不需要复杂的正则表达式匹配时使用。

 1server {
 2    listen 80;
 3    server_name example.com;
 4
 5    location / {
 6        return 302 http:
 7    }
 8}

解释:

  • return 302:返回302 Found状态码,表示临时重定向。
  • http://example.com/temp-page:新的URL地址。

例子:

  • 请求http://example.com/会直接被重定向到http://example.com/temp-page,并返回302状态码。

综合使用rewrite与location

rewrite常与location指令结合使用,达到精细化控制重写的目的。

示例 1: 针对特定路径的重写

 1server {
 2    listen 80;
 3    server_name example.com;
 4
 5    location /products {
 6        rewrite ^/products/(.*)/details$ /new-products/$1/details last;
 7    }
 8}

解释:

  • 匹配所有/products/XXX/details请求,并将其重写为/new-products/XXX/details

例子:

  • 请求http://example.com/products/123/details 会被重写为http://example.com/new-products/123/details

示例 2: 重定向根目录到特定页面

 1server {
 2    listen 80
 3    server_name example.com
 4
 5    location / {
 6        rewrite ^/$ /home permanent
 7    }
 8}

解释:

  • ^/$:匹配根目录请求/
  • /home:重定向到/home页面,并返回301状态码。

例子:

  • 请求http://example.com/ 会被重定向到http://example.com/home
个人笔记记录 2021 ~ 2025