Nginx基础

什么是Nginx?

Nginx 是一款常用的轻量级、高性能的反向代理服务器软件,主要用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 等协议。它的优势在于高效的反向代理和负载均衡能力,可以处理大量并发连接。大概可以处理2-3万并发连接数,官方监测能支持5万并发

Nginx有什么优点?

  • 高性能:Nginx 使用事件驱动的异步架构,能够支持大量并发连接,处理效率高
  • 反向代理:Nginx 可以作为反向代理,将请求转发到后端服务器,提供负载均衡和缓存等功能。
  • 高可用性:Nginx 支持热部署和动态配置,不需要重启即可生效,提供了高可用性和灵活性。
  • 高扩展性:Nginx 支持模块化架构,可以通过添加第三方扩展来满足不同需求。
  • 轻量级:Nginx 的代码设计简单,内存占用少,适合用于资源受限的环境。

为什么Nginx性能高?

  • 事件处理机制:Nginx 使用基于事件驱动的处理模型,采用异步非阻塞 IO 操作,充分利用系统资源,提高并发能力。
  • 高效的网络模块:Nginx 内置了高效的网络模块,包括 TCP/UDP 监听、HTTP 解析和缓存等,提升网络处理性能。
  • 轻量级进程:Nginx 采用多进程或多线程的方式处理请求,每个进程只占用较少的内存,减少了上下文切换的开销。
  • 负载均衡:Nginx 提供负载均衡功能,可以将请求分发到多个后端服务器上,平衡负载,提高性能和可靠性。

Nginx有什么应用场景?

  • 反向代理和负载均衡:将请求分发到多个后端服务器,提高性能和可靠性。
  • 静态文件服务器:可以作为静态内容的Web服务器,用来快速、高效地提供静态文件,如图片、CSS 和 JavaScript 等。
  • 缓存服务器:缓存静态内容或动态内容,以提高访问速度。
  • SSL/TLS 终端代理:作为 SSL/TLS 终端,解密请求并将其转发到后端服务器进行处理。
  • HTTP/2 服务器:支持 HTTP/2 协议的高性能 Web 服务器。

Nginx是怎么处理请求的?

  1. 客户端发送请求:从客户端发起HTTP或HTTPS请求,将请求发送到Nginx服务器。
  2. Nginx接收请求:Nginx服务器接收到客户端的请求,并根据预先设置的监听端口、虚拟主机等配置进行匹配。
  3. 请求匹配:根据配置文件中的规则和条件,Nginx匹配请求,确定如何处理该请求。这些规则可以包括虚拟主机配置、URL路由、反向代理等。
  4. 处理静态资源:如果请求是针对静态资源(如HTML、CSS、JavaScript、图像等),Nginx可以直接从磁盘中读取并返回给客户端,无需转发给后端服务器。
  5. 反向代理和负载均衡:如果请求需要转发给后端服务器,Nginx可以作为反向代理将请求转发给一个或多个后端服务器。Nginx可以基于负载均衡算法(如轮询、IP哈希、最少连接数等)选择合适的后端服务器进行请求转发,实现请求的分发和负载均衡。
  6. 等待后端服务器响应:Nginx将请求转发给后端服务器,并等待后端服务器处理请求并返回响应结果。
  7. 返回响应给客户端:一旦Nginx收到后端服务器的响应,它将把响应结果返回给客户端。如果需要,Nginx还可以进行一些处理,如HTTP头的修改、内容过滤等。
  8. 维持持久连接:Nginx可以在响应返回给客户端后,保持与客户端的TCP连接,以便在之后的请求中继续使用该连接,提高性能和效率。

正向代理与反向代理

什么是正向代理?

正向代理,也叫做“客户端代理”,客户端通过正向代理服务器发送请求,代理服务器将请求转发给目标服务器,并将响应返回给客户端。在正向代理中,客户端需要知道代理服务器的存在,发起请求时要显式指定代理服务器。流程如下:

  1. 客户端配置代理:客户端需要手动配置代理服务器的地址和端口,告知客户端使用代理进行访问。
  2. 客户端发起请求:客户端发送请求到代理服务器,请求中的目标地址为最终要访问的资源服务器。
  3. 代理服务器接收请求:代理服务器接收到客户端的请求。
  4. 代理服务器转发请求:代理服务器将客户端的请求转发给目标服务器。
  5. 目标服务器响应请求:目标服务器接收到代理服务器的请求后,处理并生成响应结果。
  6. 代理服务器接收响应:代理服务器接收到目标服务器的响应结果。
  7. 代理服务器返回响应:代理服务器将目标服务器的响应结果返回给客户端。
  8. 客户端接收响应:客户端通过代理服务器收到目标服务器的响应结果。

什么是反向代理?

反向代理,也叫做“服务器代理”,客户端发送请求到反向代理服务器,代理服务器根据配置的规则将请求转发给具有该资源的后端服务器,并将响应返回给客户端。在反向代理中,客户端不知道代理服务器的存在,也不知道实际提供资源的后端服务器

  1. 客户端发起请求:客户端向反向代理服务器发送请求,请求中的目标地址是指向反向代理服务器。
  2. 反向代理服务器接收请求:反向代理服务器接收到客户端的请求。
  3. 反向代理服务器确定后端服务器:反向代理服务器根据配置的规则和负载均衡算法,确定要将请求转发给哪个后端服务器来处理。
  4. 反向代理服务器转发请求:反向代理服务器将客户端的请求转发给选定的后端服务器。
  5. 后端服务器处理请求:后端服务器接收到反向代理服务器转发的请求,并处理请求并生成响应结果。
  6. 后端服务器将响应发送给反向代理服务器:后端服务器将处理完毕的响应结果发送给反向代理服务器。
  7. 反向代理服务器接收响应:反向代理服务器接收到后端服务器的响应结果。
  8. 反向代理服务器返回响应:反向代理服务器将后端服务器的响应结果返回给客户端。
  9. 客户端接收响应:客户端通过反向代理服务器收到后端服务器的响应结果。

使用反向代理服务器的优点是什么?

  • 负载均衡:反向代理服务器可以将请求分发到多个后端服务器上,实现负载均衡。通过根据服务器的负载情况智能地分配请求,可以提高系统的性能和可扩展性。
  • 安全性增强:反向代理服务器作为前端与外部通信的接口,可以提供一层保护,防止外部攻击直接访问到后端服务器。它可以过滤恶意请求、进行访问控制、实施SSL/TLS终端代理等安全策略,增强系统的安全性。
  • 缓存加速:反向代理服务器可以缓存静态内容或动态内容,减轻后端服务器的负载,提高响应速度。通过缓存常用的资源,可以减少对后端服务器的请求,提升用户体验。
  • 系统解耦:通过使用反向代理服务器,可以将前端与后端服务器解耦,使其相互独立运行。这样可以简化系统架构,提高系统的可维护性和灵活性。
  • 高可用性:反向代理服务器可以动态地管理、添加或删除后端服务器。当某个后端服务器不可用时,反向代理服务器可以自动切换到其他可用的服务器,确保服务的高可用性。
  • 网络优化:反向代理服务器可以通过对请求进行压缩、合并或重定向等操作,优化网络传输,并减少对带宽的需求。这有助于提升网站的性能和用户体验。

Nginx安装

版本概括
Mainline versionMainline 是 Nginx 目前主力在做的版本,可以说是开发版
Stable version最新稳定版,生产环境上建议使用的版本
Legacy versions遗留的老版本的稳定版

使用yum安装Nginx

(1)安装yum-utils

1
sudo yum install yum-utils

(2)添加Nginx的yum资源库

1
rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

(3)使用yum命令安装 nginx

1
yum -y install nginx

默认地址

路径简介
/etc/nginx/nginx.confyum方式安装后默认配置文件的路径
/usr/share/nginx/htmlnginx网站默认存放目录
/usr/share/nginx/html/index.html网站默认主页路径

Nginx基本使用

系统管理Nginx

操作简介
systemctl start nginx启动nginx
service stop nginx快速停止nginx
service quit nginx优雅的停止nginx
service reload nginx重新加载nginx配置
systemctl enable nginx.service设置nginx开机自启动
systemctl disable nginx禁止开机自启
nginx -v查看版本信息
systemctl status nginx查看nginx状态
ps -ef | grep nginx查看进程apache/httpd
netstat -anpl | grep ‘nginx’查看服务端口

Nginx操作命令

操作简介
nginx -t 配置文件路径测试指定配置文件是否有语法错误
nginx -c 配置文件路径指定配置文件启动Nginx,默认配置目录:/etc/nginx/nginx.conf
nginx -s stop快速关闭
nginx -s quit优雅的关闭
nginx -s reopen重启
nginx -s reload重新加载配置

测试启动

(1)启动nginx

1
systemctl start nginx

(2)查看进程和端口

1
2
3
4
# 查看进程
ps -ef | grep nginx
# 查看端口
netstat -anpl | grep 'nginx'

(3)访问http://主机地址/(需要关闭防火墙)

Nginx配置文件

配置文件组成

通常来说,Nginx 的主配置文件 nginx.conf有很多模块组成

模块说明
全局块(Global Block)全局模块,用于配置全局指令,这些配置将适用于整个Nginx服务器。
events块事件处理模块,用于配置与连接相关的指令。
http块核心模块,用于配置HTTP协议相关的指令。一个http块包含一个或多个server块,每个server块代表一个或多个虚拟主机。
server块虚拟主机模块,用于配置单个HTTP服务器的指令。一个server块包含一个或多个location块,对应着一个或多个URL地址。
location块URL匹配映射模块,用于配置请求URI与资源文件之间的映射关系,如反向代理、重定向、访问限制等。

配置文件详解

(1)打开配置文件

1
vim /etc/nginx/nginx.conf
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# 全局块-----------------------------------------------------------------------------------------------------
# 全局块定义了Nginx整个运行环境的全局参数,控制着Nginx服务器的全局配置

# 指定Nginx工作进程运行的用户和用户组,该指令在编译安装Nginx时指定,默认为nobody
user nginx;

# 指定Nginx开启的工作进程个数。一般建议设置为CPU核心数的两倍
# worker_process, 值越大,可以支持的并发处理量也越多,但是还是和服务器的硬件相关
worker_processes auto;

# 指定Nginx错误日志的存放路径和级别。错误级别包括debug、info、notice、warn、error、crit、alert、emerg
error_log /var/log/nginx/error.log notice;

# 指定Nginx主进程PID文件的存放路径
pid /var/run/nginx.pid;

# events块--------------------------------------------------------------------------------------------------
# events块是用来配置Nginx事件处理模块的,指定Nginx如何处理客户端请求和网络事件
events {
# 限制每个工作进程所能接受的最大客户端连接数,默认值为512,正向代理:连接数 * 进程数、反向代理:连接数 * 进程数 / 4
# linux系统限制最多能同时打开65535个文件,默认上限就是65535,可解除 ulimit -n 65535
worker_connections 1024;

# 定义一个工作进程是否能一次性处理多个网络连接事件,默认为off
multi_accept on;

# 指定事件驱动模式,支持select、poll、epoll、kqueue、/dev/poll等多种模式,默认为epoll
use epoll;

# 指定是否启用进程间的互斥锁,防止多个工作进程同时处理同一请求。默认为on
accept_mutex on;

# 指定互斥锁延迟时间,避免多个工作进程同时竞争互斥锁。单位为毫秒,默认为500。
accept_mutex_delay 500;

# 指定使用异步IO方式处理磁盘IO操作的最大请求数量。默认为32。
worker_aio_requests 32;

# 指定调试事件处理程序的IP地址段,只有来自这些地址的连接才会触发调试输出
debug_connection off;
}

# http块----------------------------------------------------------------------------------------------------
# 最核心的模块,是所有Web应用程序配置的大本营,定义了Nginx HTTP服务器的各种配置参数和行为
http {
# 定义自定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

# 指定访问日志的存放路径和格式
access_log /var/log/nginx/access.log main;

# 指定默认的MIME类型,当文件类型无法识别时会使用该类型,下面配置为了二进制流
default_type application/octet-stream;

# 用于直接将磁盘上的文件发送到客户端,减少CPU开销,启用on或禁用off,
sendfile on;

# 用于优化在一个TCP数据流中发送多个包时的网络性能,启用on或禁用off
tcp_nopush on;

# 用于优化在一个TCP数据流中发送少量数据时的网络性能,启用on或禁用off
tcp_nodelay on;

# 指定HTTP连接的超时时间,单位为秒
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;

# 设置处理虚拟主机名称映射时使用的哈希桶大小,默认为32,可以根据需要进行修改
server_names_hash_bucket_size 32;

# 控制是否在HTTP响应头中返回服务器版本信息
server_tokens off;

# 压缩功能,用于减少数据传输量,启用on或禁用off
gzip on;

# 指定需要压缩的文件类型
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

# 用于设定通用的文件缓存,用于文件系统的访问控制
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

# 指定字符集
charset utf-8;

# server块----------------------------------------------------------------------------------------------
# server 块用于指明虚拟主机,下面采用include引入多个server块配置

# include用于引入其他配置文件,例如include file1 [file2 ...]
include /etc/nginx/conf.d/*.conf;
}

(2)在上面include引入的路径下创建server块的配置

1
vim /etc/nginx/conf.d/default.conf
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
80
81
82
83
84
85
86
server {
# listen用于设定 server 块监听的端口号和地址
# 语法:listen [服务器 IP 地址:]服务器监听的端口号 [其他选项,可以是 reuseport、default_server、ssl 等];
listen 80;

# 指定ip地址或域名,多个域名使用空格隔开
server_name localhost;

# SSL证书文件路径
ssl_certificate /etc/nginx/ssl/example.crt;
# SSL证书私钥文件路径
ssl_certificate_key /etc/nginx/ssl/example.key;
# SSL会话超时时间为5分钟
ssl_session_timeout 5m;
# SSL协议版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# location块--------------------------------------------------------------------------------------------
# location 块用于匹配请求的 URL 路径,并指定相应的处理方式。location 块中可以配置反向代理、重定向、缓存等
# location 块的语法格式:location [修饰符] uri {...}
# = 严格匹配,只有当 uri 与请求路径完全一致时才会命中该 location 块
# ~ 正则匹配,区分大小写的正则表达式匹配
# ~* 正则匹配,不区分大小写的正则表达式匹配
# ^~ 最佳匹配,以普通字符匹配,通常用来匹配目录,如果命中则不再查找其他的 location 块

# 匹配所有以 / 开头的 URL,将请求的根目录设置为 /usr/share/nginx/html 并指定默认首页为 index.html
location / {
# 指定这个虚拟主机的根目录
root /usr/share/nginx/html;
# 指定默认首页
index index.html index.htm;
}

# 匹配以/images/开头的 URL将请求的根目录设置为 /var/www 指定了不同的缓存过期时间
location /images/ {
# 指定这个虚拟主机的根目录
root /var/www;
# 缓存过期时间
expires 1d;
}

# 匹配以/css/开头的 URL将请求的根目录设置为 /var/www 指定了不同的缓存过期时间
location /css/ {
# 指定这个虚拟主机的根目录
root /var/www;
# 缓存过期时间
expires 1h;
}

# 匹配以/js/开头的 URL将请求的根目录设置为 /var/www 指定了不同的缓存过期时间
location /js/ {
# 指定这个虚拟主机的根目录
root /var/www;
# 缓存过期时间
expires 30m;
}

# 匹配以 /api/ 开头的 URL 并将请求转发到本地的 3000 端口,设置请求头 Host 和 X-Real-IP
location /api/ {
# 将请求转发
proxy_pass http://localhost:3000;
# 设置请求头Host
proxy_set_header Host $host;
# 设置请求头X-Real-IP
proxy_set_header X-Real-IP $remote_addr;
}

# 匹配以/admin/ 开头的 URL 并拒绝所有该地址开头的请求,返回 403 错误页面
location /admin/ {
# 拒绝所有请求
deny all;
# 返回 403 错误页面
return 403;
}

# 使用正则表达式进行匹配,匹配以 /user 或 /account 开头的 URL,并将它们重写为 / 加上 id 参数,例如 /user/123 会被重写为 /123?id=user
location ~ /(user|account)/ {
rewrite ^/(\w+)/(.*)$ /$2?id=$1 last;
}

# 匹配以 /files/ 开头的 URL,并开启自动目录索引功能
location /files/ {
autoindex on;
}

}