nginx ¶
简介 ¶
基于C语言开发开源、高性能web服务器和反向代理服务器
反向代理:接受客户端请求,转发请求到真实服务器处理,将处理结果返回客户端

正向代理:访问外部资源时,通过代理服务器去访问
反向代理服务的时服务器,正向代理服务的是客户端
安装及基础命令 ¶
安装
bash
1tar -zxvf nginx-1.20.1.tar.gz
2cd nginx-1.20.1/
3
4# configure 报错时一般缺少一些库,根据提示安装即可
5# ubuntu : apt-get install libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev make
6./configure --prefix=/usr/local/nginx --with-http_ssl_module
7
8# 编译,编译后的nginx文件在objs里
9make
10
11# 安装,将编译后的文件安装到系统(创建相关目录等)
12make install
13
14# 重新编译时用得上
15make clean #清除上一次make命令生成的文件启动
bash
1/usr/local/nginx/sbin/nginx #普通启动
2 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #通过配置文件启动
3ps -ef | grep nginx #查看nginx进程,master和worker两个进程(主进程/工作进程)关闭
bash
1kill -QUIT 进程id #优雅关闭,等待所有请求处理后关闭
2kill -TERM 进程id #快速关闭,直接杀死重启
bash
1/usr/local/nginx/sbin/nginx -s reload #杀死进程,然后重新启动其他命令
bash
1/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t #-t参数,启动时检查配置文件
2/usr/local/nginx/sbin/nginx -V #查看nginx版本号、编译器版本、参数配置默认目录
- /etc/nginx:nginx配置文件目录, 所有的nginx配置文件都在这里
- /etc/nginx/nginx.conf:nginx的主配置文件, 可以修改它来改变nginx的全局配置.
- /etc/nginx/sites-available:这个目录存储每一个网站的"server blocks", nginx通常不会使用这些配置, 除非它们被链接到sites-enabled目录. 一般所有的server block配置都在这个目录中设置, 然后软链接到别的目录
- /etc/nginx/sites-enabled:这个目录存储生效的"server blocks"配置. 通常, 这个配置都是链接到sites-available目录中的配置文件.
- /etc/nginx/snippets:这个目录主要可以包含在其它nginx配置文件中的配置片段, 重复的配置都可以重构为配置片段.
- /var/log/nginx/access.log:每一个访问请求都会默认记录在这个文件中, 除非你做了其它设置.
- /var/log/nginx/error.log:任何nginx的错误信息都会记录到这个文件中.
nginx配置文件 ¶
基础配置 ¶
ini
1#worker进程运行用户
2#user nobody;
3
4#work进程默认条数,通常为CPU数量两倍或等于CPU数量
5worker_processes 1;
6
7#配置全局错误日志及类型 [debug|info|notice|warn|error|crit],默认为 error
8#error_log logs/error.log error;
9
10#配置进程PID文件,存放进程
11#pid logs/nginx.pid;events配置 ¶
ini
1#配置工作模式和连接数
2events {
3 #一个work进程连接上限,nginx并发连接上线为worker_processes*worker_connections,上限为65535
4 worker_connections 1024;
5}http配置 ¶
ini
1#配置http服务器,利用它的反向代理实现负载均衡
2http {
3 #配置nginx支持可以支持的多媒体类型,/conf/mine.types下可以看见支持的文件
4 include mime.types;
5
6 #默认以流形式打开,未识别时
7 default_type application/octet-stream;
8
9 #配置asses.log日志格式及存放路径,main是变量名
10 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
11 # '$status $body_bytes_sent "$http_referer" '
12 # '"$http_user_agent" "$http_x_forwarded_for"';
13
14 #配置asses.log日志存放路径
15 #access_log logs/access.log main;
16
17 #开启高效文件传输模式
18 sendfile on;
19 #防止网络阻塞
20 #tcp_nopush on;
21
22 #长连接超时时间
23 keepalive_timeout 65;
24
25 #开启gzip压缩输出
26 #gzip on;
27
28 #虚拟主机,一个http配置可以有多个server,端口号和域名不能完全一致
29 server {
30 #端口号
31 listen 80;
32 #域名
33 server_name localhost;
34
35 #编码格式,默认为utf-8
36 #charset koi8-r;
37
38 #访问日志,访问这个server主机时输出日志
39 #access_log logs/host.access.log main;
40
41 #默认的匹配 / 处理,当访问中有 / 时(/ 根路径),匹配到该location处理
42 location / {
43 #本地磁盘的根路径
44 root html;
45 #默认欢迎页
46 index index.html index.htm;
47 }
48
49 #配置错误页
50 #error_page 404 /404.html;
51 # redirect server error pages to the static page /50x.html
52 #配置50x错误页面
53 error_page 500 502 503 504 /50x.html;
54
55 #精准匹配,
56 location = /50x.html {
57 root html;
58 }
59
60 # deny access to .htaccess files, if Apache's document root
61 # concurs with nginx's one
62 #
63 #location ~ /\.ht {
64 # deny all;
65 #}
66 }
67 #这里可以继续配置其他server虚拟主机
68}Location 详解 ¶
基本语法
ini
1location [修饰符] /匹配路径 {
2 # 处理规则(如 proxy_pass、root、rewrite 等)
3}- 修饰符:决定匹配方式(可选,无修饰符为默认匹配);
- 匹配路径:要匹配的 URI 路径(支持字符串、正则表达式);
- 块内指令:匹配成功后执行的操作(如
root、proxy_pass、return等)。
location 的匹配优先级由修饰符决定,优先级从高到低 如下:
| 修饰符 | 匹配类型 | 说明 |
|---|---|---|
| = | 精确匹配 | 严格匹配 URI 全路径,匹配成功立即终止后续匹配 |
| ^~ | 前缀匹配(非正则) | 匹配 URI 前缀,优先级高于正则匹配,匹配成功终止后续正则匹配 |
| ~ | 正则匹配(区分大小写) | 按配置顺序匹配正则表达式,第一个匹配成功即生效 |
| ~* | 正则匹配(不区分大小写) | 与 ~ 类似,但忽略大小写 |
| 无修饰符 | 普通前缀匹配 | 匹配 URI 前缀,优先级最低,最终会选择最长匹配的路径 |
关键注意事项
proxy_pass末尾斜杠的坑;proxy_pass末尾是否加/,会影响 URI 的拼接规则ini1# 场景1:location 路径以 / 结尾,proxy_pass 不加 / 2location /api/ { 3 proxy_pass http://127.0.0.1:8080; 4 # 请求 /api/user → 转发到 http://127.0.0.1:8080/api/user 5} 6 7# 场景2:location 路径以 / 结尾,proxy_pass 加 / 8location /api/ { 9 proxy_pass http://127.0.0.1:8080/; 10 # 请求 /api/user → 转发到 http://127.0.0.1:8080/user(去掉 /api/ 前缀) 11}正则匹配的顺序;
~/~*按配置文件中出现的顺序匹配,第一个匹配成功即生效,因此需将更具体的正则写在前面ini1# 错误:先匹配通用正则,导致 /api/v2/ 永远匹配不到 2location ~ /api/ { ... } 3location ~ /api/v2/ { ... } 4 5# 正确:先匹配具体正则 6location ~ /api/v2/ { ... } 7location ~ /api/ { ... }大小写敏感
- 系统层面:Linux 文件系统区分大小写(如
index.HTML和index.html是不同文件); - Nginx 层面:
~区分大小写,~*不区分,无修饰符的前缀匹配区分大小写。
- 系统层面:Linux 文件系统区分大小写(如
静态网站部署 ¶
修改配置文件,添加一个匹配,绑定根目录到自己的目录
ini1location / { 2 root /usr/share/nginx/html; 3 index index.html index.htm; 4} 5location /myweb { 6 root /home/html; 7 index index.html index.htm; 8}root指定的时/路径,所以需要在/home/html下创建myweb目录重启nginx:
nginx -s reload
负载均衡 ¶
原理图统一入口nginx

基本配置
location拦截 /myweb 请求,proxy_pass 然后转发到 upstream 中处理
ini
1upstream myweb {
2 server 192.168.115.128:8081;
3 server 192.168.115.128:8082;
4}
5server{
6 location /myweb {
7 proxy_pass http://myweb;
8 }
9}负载均衡策略
轮询(默认)
ini1#轮流发给每个服务器 2upstream myweb { 3 server 192.168.115.128:8081; 4 server 192.168.115.128:8082; 5}权重策略
ini1#按照权重,如下:3个请求,一个服务器处理2个,另个服务器处理1个 2upstream myweb { 3 server 192.168.115.128:8081 weight=2; 4 server 192.168.115.128:8082 weight=1; 5}ip hash
ini1#根据ip值hash,相同的ip总是访问同一个服务器,不会丢失session,但是不建议使用,可能存在所有请求在一个服务器 2upstream myweb { 3 ip_hash; 4 server 192.168.115.128:8081; 5 server 192.168.115.128:8082; 6}最少连接数
ini1#转发请求到处理请求最少的服务器 2upstream myweb { 3 least conn; 4 server 192.168.115.128:8081; 5 server 192.168.115.128:8082; 6}
其他配置
备份
ini1#在非backup服务器全部宕机时,请求转发到backup服务器,版本更新时可用 2upstream myweb { 3 server 192.168.115.128:8081; 4 server 192.168.115.128:8082 backup; 5}down
ini1#标记down的服务器不参与负载均衡 2upstream myweb { 3 server 192.168.115.128:8081; 4 server 192.168.115.128:8082 down; 5}
静态代理 ¶
静态资源由nginx处理,通过拦截静态资源的请求,进行相应的处理
实现方式一,在 location 中配置静态资源的后缀,拦截请求后缀名
ini
1location ~.*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|f;v|mid|doc|ppt|pdf|xlx|mp3|wma)$ {
2 root /opt/static;
3}实现方式二,在 location 中配置静态资源所在目录实现,拦截请求路径
ini
1location ~.*/(css|js|img|images) {
2 root /opt/static;
3}动静分离 ¶
整体架构图架构图

实现
nginx负载均衡服务器
ini1upstream myweb { 2 ip_hash; 3 server 192.168.115.128:8081; 4 server 192.168.115.128:8082; 5} 6upstream static { 7 server 192.168.115.128:81; 8 server 192.168.115.128:82; 9} 10server{ 11 location /myweb { 12 proxy_pass http://myweb; 13 } 14 location ~.*/(css|js|img|images) { 15 proxy_pass http://static; 16 } 17}配置存放静态资源的nginx服务器
ini1location ~.*/(css|js|img|images) { 2 root /opt/static; 3}
虚拟主机 ¶
基于端口(不重要)
ini
1server {
2 #端口号
3 listen 80;
4 #域名
5 server_name localhost;
6 location / {
7 root html;
8 index index.html index.htm;
9 }
10 error_page 500 502 503 504 /50x.html;
11 location = /50x.html {
12 root html;
13 }
14}
15server {
16 #端口号
17 listen 81;
18 #域名
19 server_name localhost;
20 location / {
21 root html;
22 index index.html index.htm;
23 }
24 error_page 500 502 503 504 /50x.html;
25 location = /50x.html {
26 root html;
27 }
28}基于域名(重要)
ini
1server {
2 #端口号
3 listen 80;
4 #域名
5 server_name www.myweb1.com;
6 location / {
7 root html;
8 index index.html index.htm;
9 }
10 error_page 500 502 503 504 /50x.html;
11 location = /50x.html {
12 root html;
13 }
14}
15server {
16 #端口号
17 listen 80;
18 #域名
19 server_name www.myweb2.com;
20 location / {
21 root html;
22 index index.html index.htm;
23 }
24 error_page 500 502 503 504 /50x.html;
25 location = /50x.html {
26 root html;
27 }
28}配置示例 ¶
nginx
1server {
2 listen 80;
3 server_name shop.example.com;
4 root /var/www/shop;
5
6 # ==========================================
7 # 1. 精确匹配 (=) - 最高优先级
8 # ==========================================
9
10 # 首页精确匹配 - 加快首页访问速度
11 location = / {
12 return 200 "欢迎来到首页 [精确匹配 =]";
13 add_header Content-Type text/plain;
14 }
15
16 # robots.txt 精确匹配
17 location = /robots.txt {
18 return 200 "User-agent: *\nDisallow: /admin/";
19 add_header Content-Type text/plain;
20 }
21
22 # favicon.ico 精确匹配
23 location = /favicon.ico {
24 log_not_found off;
25 access_log off;
26 expires 30d;
27 }
28
29
30 # ==========================================
31 # 2. 前缀优先匹配 (^~) - 阻止正则匹配
32 # ==========================================
33
34 # 静态资源目录 - 不需要正则处理,直接命中提高性能
35 location ^~ /static/ {
36 alias /var/www/shop/static/;
37 expires 30d;
38 add_header Cache-Control "public, immutable";
39 return 200 "静态资源目录 [前缀优先 ^~]";
40 }
41
42 # 上传文件目录
43 location ^~ /uploads/ {
44 alias /var/www/shop/uploads/;
45 expires 7d;
46 return 200 "上传文件目录 [前缀优先 ^~]";
47 }
48
49 # 阻止访问隐藏文件
50 location ^~ /. {
51 deny all;
52 return 403 "禁止访问隐藏文件 [前缀优先 ^~]";
53 }
54
55
56 # ==========================================
57 # 3. 正则匹配 (~ ~*) - 按顺序匹配
58 # ==========================================
59
60 # 图片文件处理 (区分大小写)
61 location ~ \.(jpg|jpeg|png|gif|webp|svg|ico)$ {
62 expires 30d;
63 add_header Cache-Control "public";
64 return 200 "图片文件 [正则匹配 ~]";
65 }
66
67 # CSS/JS 文件处理 (不区分大小写)
68 location ~* \.(css|js)$ {
69 expires 7d;
70 add_header Cache-Control "public";
71 return 200 "CSS/JS文件 [正则不区分大小写 ~*]";
72 }
73
74 # 字体文件处理
75 location ~* \.(ttf|woff|woff2|eot)$ {
76 expires 365d;
77 add_header Cache-Control "public, immutable";
78 add_header Access-Control-Allow-Origin *;
79 return 200 "字体文件 [正则不区分大小写 ~*]";
80 }
81
82 # 视频文件处理
83 location ~* \.(mp4|webm|ogg|avi)$ {
84 expires 30d;
85 add_header Cache-Control "public";
86 return 200 "视频文件 [正则不区分大小写 ~*]";
87 }
88
89 # PHP 文件处理 (演示正则顺序重要性)
90 location ~ \.php$ {
91 # fastcgi_pass unix:/var/run/php-fpm.sock;
92 # fastcgi_index index.php;
93 return 200 "PHP文件处理 [正则匹配 ~]";
94 }
95
96 # 禁止访问备份文件
97 location ~ \.(bak|backup|old|tmp)$ {
98 deny all;
99 return 403 "禁止访问备份文件 [正则匹配 ~]";
100 }
101
102
103 # ==========================================
104 # 4. 普通前缀匹配 - 最长匹配原则
105 # ==========================================
106
107 # API 接口 v2 (更长的前缀)
108 location /api/v2/ {
109 proxy_pass http://backend_v2;
110 return 200 "API v2接口 [普通前缀,更长]";
111 }
112
113 # API 接口 v1 (较短的前缀)
114 location /api/v1/ {
115 proxy_pass http://backend_v1;
116 return 200 "API v1接口 [普通前缀,较短]";
117 }
118
119 # API 接口通用
120 location /api/ {
121 proxy_pass http://backend;
122 return 200 "API通用接口 [普通前缀,最短]";
123 }
124
125 # 商品详情页
126 location /product/ {
127 try_files $uri$uri/ /product/index.html;
128 return 200 "商品详情页 [普通前缀]";
129 }
130
131 # 用户中心
132 location /user/ {
133 try_files $uri$uri/ /user/index.html;
134 return 200 "用户中心 [普通前缀]";
135 }
136
137 # 管理后台
138 location /admin/ {
139 auth_basic "Admin Area";
140 auth_basic_user_file /etc/nginx/.htpasswd;
141 return 200 "管理后台 [普通前缀]";
142 }
143
144
145 # ==========================================
146 # 5. 通用匹配 - 兜底规则
147 # ==========================================
148
149 # 所有其他请求
150 location / {
151 try_files $uri$uri/ /index.html;
152 return 200 "通用匹配 [兜底规则]";
153 }
154}