1 Nginx使用详解
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
安装可为命令行安装和源码安装: 1
2
3
4
5
6
7# 更新索引
sudo apt update
# 安装nginx
sudo apt install nginx
# 验证安装ok
# 使用curl命令访问服务
curl http://127.0.0.11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default
/etc/nginx/conf.d # 这个目录下的所有配置文件都会被包含进nginx.conf中
# 可执行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx库文件
/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程
/usr/lib64/nginx/modules # Nginx模块目录
# 帮助文档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 静态资源目录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx日志文件
/var/log/nginx
Nginx文件存放目录
| 路径 | 描述 |
|---|---|
/var/log/nginx |
nginx运行日志的目录 |
/var/www/html、/usr/share/nginx/html |
web项目目录 |
/usr/sbin/nginx |
服务文件 |
/etc/nginx |
配置文件目录 |
相关命令 1
2
3
4
5
6nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启 Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题
1.2 Nginx的特点与作用
- 异步非阻塞的事件驱动模型,支持高并发、高性能;
- 模块化架构使得它的扩展性非常好;
- 热部署、平滑升级;
对于nginx,其作用和用途有以下几点:
正向代理:向代理的代理对象是客户端。正向代理就是代理服务器替客户端去访问目标服务器。
反向代理:反向代理指代理后端服务器响应客户端请求的一个中介服务器,代理的对象是服务端。
负载均衡:nginx支持轮询、权重、按ip哈希和按响应时间来分配请求应该请求到哪个被代理的服务器上
静态资源服务,通过本地文件系统提供服务;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 按权重,weight 越高,被分配的客户端越多
upstream myserver {
server 192.167.4.32:5000 weight=10;
server 192.168.4.32:8080 weight=5;
}
// 按请求 ip 的 hash 值分配,每个访客固定访问一个后端服务器
upstream myserver {
ip_hash;
server 192.167.4.32:5000;
server 192.168.4.32:8080;
}
// 按后端服务器的响应时间来分配,响应时间短的优先分配到请求
upstream myserver {
fair;
server 192.168.4.32:5000;
server 192.168.4.32:8080;
}nginx缓存:nginx可以通过配置文件设置缓存策略和过期时间
动静分离:静态资源如html、js、img、css等若放在后端服务上,影响服务QPS,nginx可将静态资源分离,可部署于Nginx服务本身
1.3 Nginx配置文件详解
Nginx中对于nginx.conf的配置信息主要有以下几个重要字段:
main: 全局配置,对全局生效;events配置影响 Nginx 服务器与用户的网络连接;http配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;server配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;location用于配置匹配的 uri ;upstream配置后端服务器具体地址,负载均衡配置不可或缺的部分;
1 | # main段配置信息 |
1.4 全局配置
worker_processes:通过使用auto参数,Nginx 可以根据系统的负载情况智能地分配工作进程,以提供更好的性能和资源利用率worker_cpu_affinity:worker_cpu_affinity指令用于控制worker进程与 CPU的亲和性(affinity)关系。如worker_cpu_affinity 00000001 00000010; 这意味着两个worker,每个 worker 进程将绑定到对应的 CPU核心上,编号为 1 和 2。通过这种方式,可以手动调整 worker 进程与 CPU 核心之间的关系,以便更好地利用硬件资源pid:PID 路径修改worker_priority:工作进程优先级,-20~20(19)worker_rlimit_nofile 65536:所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
1 | 修改主配置文件 |
1.5 event配置
在Nginx的主配置文件中,events部分用于配置Nginx服务器的事件模块相关参数,控制Nginx服务器在处理连接请求时的行为。常见的events配置参数:
worker_connections:指定每个工作进程可以同时处理的最大连接数。multi_accept:指定是否一次接受多个连接。默认情况下,Nginx在每个循环中只接受一个连接,但设置multi_accept为"on"后可以同时接受多个连接。use:指定Nginx使用的事件模块。常见的事件模块有"epoll"、"kqueue"和"eventport"等。
1 | events { |
1.6 http部分
1.6.1 http部分详解
include:引入其他配置文件,通常用于加载 MIME 类型配置文件。default_type:指定默认的 MIME 类型。server:定义一个或多个虚拟主机。listen:指定该虚拟主机监听的端口。server_name:指定域名,用于匹配请求的主机头。root:指定虚拟主机的根目录。location:用于匹配不同的 URL,并定义相关配置规则
1 | #基本格式 |
具体实例如下:
1 | http { |
1.6.2 mime
在Nginx中,“mime” 是一种配置指令,用于设置 MIME
类型与文件扩展名的映射关系。 1
2vim /etc/nginx/mime.types
//查看当前Nginx服务器配置的MIME类型列表
1.6.3 server 下的 root指令
在Nginx配置中,"root"指令用于设置服务器块(server block)的根目录,即指明软件的根目录。通常,"root"指令位于Nginx配置文件中的服务器块(server block)中。
1 | server { |
1.6.4 location模块
在Nginx中,location 是一个用于匹配请求 URL 路径的指令。它在 Nginx 配置文件中使用,在不同的 location块中定义不同的行为或处理规则。
1.7 详解实例
1 | ######Nginx配置文件nginx.conf中文详解##### |
1.8 使用实例
服务器部署于192.168.1.16:80、192.168.1.26:80,现在用Nginx进行反向代理和负载均衡,而且一些静态资源存储于nginx代理服务器下的:/var/www/html,进行静态资源分离,配置nginx配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79# 1. 定义后端应用服务器组 (负载均衡池)
upstream backend_servers {
# 使用 least_conn 算法,将请求发给当前连接数最少的服务器,实现更公平的负载。
least_conn;
# 你提供的两台应用服务器,权重均为1,可后续按性能调整。
server 192.168.1.16:80 max_fails=3 fail_timeout=30s weight=1;
server 192.168.1.26:80 max_fails=3 fail_timeout=30s weight=1;
# 可添加 backup 参数标记备份服务器。
}
# 2. 主服务器配置
server {
listen 80; # Nginx 监听的端口
server_name yourdomain.com www.yourdomain.com; # 你的域名,本地测试可填 localhost 或用 _ 通配
# 3. 核心:静态资源分离配置
# 匹配所有以常见静态资源后缀结尾的请求
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|pdf|mp4|webm)$ {
# 静态资源存储的根目录 (假设放在 192.168.1.16 这台代理服务器本地)
# 重要:这是Nginx服务器本地的路径,不是后端服务器的路径。
root /var/www/html/static;
# 开启高效文件传输(零拷贝)
sendfile on;
# 防止大文件阻塞sendfile
sendfile_max_chunk 1m;
# 设置浏览器缓存时间,减少重复请求 (可根据文件类型调整)
expires 30d; # 缓存30天
add_header Cache-Control "public, immutable";
# 记录日志便于调试(可选)
access_log /var/log/nginx/static_access.log;
# 如果文件不存在,不转发到后端,直接返回404
try_files $uri =404;
}
# 4. 动态请求代理到后端应用服务器
location / {
# 将请求反向代理到上面定义的 upstream 组
proxy_pass http://backend_servers;
# 设置必要的代理头,将客户端真实信息传递给后端
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 优化代理连接参数(可选但推荐)
proxy_connect_timeout 30;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 可在此记录动态请求日志
# access_log /var/log/nginx/dynamic_access.log;
}
# 5. 可选:对特定路径(如管理后台)进行特殊处理
# location /admin/ {
# proxy_pass http://backend_servers;
# # ... 可以设置更严格的超时或认证
# }
# 6. 错误页面配置(可选)
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html; # 错误页面存放路径
internal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
internal;
}
}
2 Nginx架构
从上面图片可以得出Nginx的极大特点:
事件驱动&异步非阻塞:nginx利用了操作系统提供的I/O多路复用接口,Linux系统中的poll,epoll。这些接口可以监视多个文件描述符的状态变化,当文件描述符可读或可写时,就会向用户线程发送一个事件通知;避免了传统的I/O模型造成在内核没有可读/可写事件(或者说没有数据可供用户进程读写)时,用户线程一直在等待
多进程机制:Nginx有两种类型的进程,一个是Master主进程,一种是Worker工作进程;主进程主要负责3项工作:加载配置、启动工作进程及非停升级。另外work进程是主进程启动后,fork而来的。当一个连接进来后,所有Worker进程,都会收到消息,但是只有一个Worker进程可以 accept 这个连接。后续相关的网络读写、存储读写、内容传输、以及请求分发会在这个worker进程进行。
proxy cache(服务端缓存):proxy cache主要实现 nginx 服务器对客户端数据请求的快速响应。nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。当客户端再次访问相同的数据时,nginx服务器直接从硬盘检索到相应的数据返回给用户,从而减少与被代理服务器交互的时间。在缓存数据时,运用了零拷贝以及mmap技术,使得数据copy性能大幅提升。
反向代理::nginx的强大之处其中一个就是他的反向代理,通过反向代理,可以隐藏真正的服务,增加其安全性,同时便于统一管理处理请求,另外可以很容易的做个负载均衡,更好的面对高并发的场景。