Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫所开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。
本文将简单介绍 Nginx
的安装与实现反向代理步骤。
一、安装部署
1. YUM安装
通过 yum
安装虽然方便但无法自定义存放目录,如果只是虚拟机测试使用则无伤大雅。
# 添加 Nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装 Nginx
yum install -y nginx
# 启动服务
systemctl start nginx.service
(1) 文件目录
- 安装目录:
/etc/nginx
。 - 配置文件:
/etc/nginx/nginx.conf
。 - 日志目录:
/var/log/nginx/access.log
。 - 异常日志:
/var/log/nginx/error.log
。 - 网站默认站点配置:
/etc/nginx/conf.d/default.conf
。 - 网站文件存放默认目录:
usr/share/nginx/html
。 - 自定义 Nginx 站点配置文件存放目录:
/etc/nginx/conf.d
。
(2) 服务启动
服务相关的启停命令如下:
systemctl start nginx.service # 启动
systemctl stop nginx.service # 关闭
systemctl restart nginx.service # 重启
2. 编译安装
除了通过 yum
安装外更推荐自定义编译安装,这里通过 wget
下载为例,当然也可以官网手动下载上传。
# 进入安装目录
cd /usr/local/
# 下载安装包,版本请自行选择
wget https://nginx.org/download/nginx-1.21.2.tar.gz
# 解压
tar -zxf nginx-1.21.2.tar.gz
(1) 文件编译
进入解压后的文件执行 configure
文件验证当前系统环境。
# 进入解压目录
cd ./nginx-1.21.2
# 验证环境
./configure
如果在执行 ./configure
报错根据下面提示执行不同操作即可。
# 提示 ./configure: error: C compiler cc is not found
yum install -y gcc-c++
# 提示 error: the HTTP rewrite module requires the PCRE library.
yum install -y pcre pcre-devel
# 提示 error: Invalid C++ compiler or C++ compiler flags.
yum install -y gcc gcc-c++
# 提示 error: the HTTP gzip module requires the zlib library.
yum install -y zlib-devel
如果没有提示异常说明环境没有问题继续执行编译即可。
# 执行编译
make
# 执行安装
make install
(2) 服务启动
编译完成后会在 /usr/local/
下生成 nginx
目录,其中 nginx/sbin
中为可执行文件,配置文件在 nginx/conf
目录下。
cd /usr/local/nginx/sbin # 打开脚本目录
./nginx # 运行
./nginx -s stop # 停止
nginx -s reload # 重载配置
nginx -t # 检查配置是否正确
3. Windows
上述两种方式都是在 Linux
环境下部署 Nginx
服务,如果是初学者可以先在 Windows
上先熟悉基本配置,下面介绍 Windows
平台部署步骤。
先进入官网下载对应的部署包:Nginx官网
解压下载的文件,其中包含如下文件,启动服务双击 nginx.exe
文件即可。
(1) 常用命令
Windwos
环境下 nginx
涉及的常用命令如下:
# 查看版本信息
nginx -V
# 测试配置文件合法性
nginx -t
(2) 服务启停
Windwos
环境下 nginx
服务启停命令如下:
# 启动服务
nginx.exe -c conf/nginx.conf
# 重载配置
nginx -s reload
# 快速关闭,可能不保存相关信息,并迅速终止服务
nginx -s stop
# 平稳关闭,保存相关信息,有安排的结束服务
nginx -s quit
二、请求代理
1. 正向代理
在正向代理模式下,客户端知道需要访问的服务器信息,通过向代理服务器发送请求来访问目标服务器上的资源,而目标服务器并不知道客户端的存在,只知道代理服务器的存在。
2. 反向代理
在反向代理模式下,客户端不再知晓具体的目标服务器信息,而是将请求发送至代理服务器,由代理服务通过一定的规则确定具体的目标服务器节点,进而执行请求并访问响应。
三、服务代理
1. 基本格式
Nginx
配置文件中主要包含三大模块:http
、server
与 location
,三者分别对应一个网络地址的 IP
、端口
与 接口地址
。
三个模块其基本的配置格式如下,当配置冲突时 location
模块优先级最高,其次为 server
,http
优先级最低,即内层优先级越高但作用范围越小。
http {
// 此处配置全局生效
server {
// 一个 server 对应一个端口
// 一个 http 模块可包含多个 server 模块
// 配置优先级高于 http 模块但低于 location 模块
location / {
// 一个 location 对应一个转发地址
// 一个 server 模块可包含多个 location 模块
// 相同配置 location 模块优先级最高
}
}
}
2. 资源代理
通过 Nginx
可实现便捷的静态资源代码,如下配置即通过本机的 8080
端口代理本地目录 /usr/local/spring/vue
下的 index.html
静态资源。
server {
listen 8080;
server_name localhost;
location / {
root /usr/local/spring/vue;
index index.html index.htm;
}
}
3. 代理转发
通过代理转发即可实现将指定服务转发至另一端口服务上。
如下述配置中即通过 127.0.0.1:5000
实现 127.0.0.1:4000
服务的资源代理,具体的配置文件如下:
server {
listen 5000;
server_name ibudai.xyz;
location / {
proxy_pass http://127.0.0.1:4000/; # 端口号替换成对应服务端口
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4. SSL服务
通过配置 SSL
服务,即可通过 HTTPS
方式访问所代理的服务,下面即介绍配置步骤:
- 到阿里云申请免费
SSL
证书,并解析绑定你的域名。 - 然后下载
nginx
对应的.key
和.pem
文件。 - 在
nginx
安装路径下新建文件夹用于存放上一步下载的两个文件,这里我创建了cert
目录。 - 在
nginx.conf
文件添加如下配置:
server {
listen 443 ssl;
server_name www.ibudai.xyz;
root /home/hexo;
index index.html index.htm;
ssl_certificate cert/xxx.pem; # .pem 证书存放目录
ssl_certificate_key cert/xxx.key; # .key 证书存放目录
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
}
四、常用配置
1. 重定向
通过 rewrite
可实现请求的重定向,如下述中将所有 HTTP
请求通过 rewrite
指令重定向到 HTTPS
。
server {
listen 80;
server_name ibudai.xyz;
rewrite ^(.*)$ https://$host$1; # 重定向请求
location / {
index index.html index.htm;
}
}
2. 超时配置
其中 keepalive_timeout
是 Nginx
中用来设置连接保持时间的参数,它决定了一个客户端和后端服务器之间的连接在空闲状态下保持打开的时间,以便复用该连接减少连接建立的开销。
当一个客户端与 Nginx
建立连接后,在超过 keepalive_timeout
设置的时间内没有再次请求,该连接将被关闭。
(Ⅰ) 请求配置(作用于客户端与代理服务器之间)
- send_timeout:设置服务器向客户端发送响应的超时时间,单位为秒。
- keepalive_timeout:设置服务器与客户端之间保持连接的超时时间,单位为秒。
- client_body_timeout:设置客户端向服务器发送请求体的超时时间,单位为秒。
- client_header_timeout:设置客户端向服务器发送请求头的超时时间,单位为秒。
(Ⅱ) 代理配置(作用于代理服务器与后端服务之间)
- proxy_connect_timeout:设置代理服务器与后端服务器建立连接的超时时间,单位为秒。
- proxy_send_timeout:设置代理服务器向后端服务器发送数据的超时时间,单位为秒。
- proxy_read_timeout:设置代理服务器从后端服务器读取数据的超时时间,单位为秒。
(Ⅲ) 其它配置
- fastcgi_connect_timeout: 设置与
FastCGI
后端服务器的连接超时时间。 - fastcgi_send_timeout: 设置向
FastCGI
后端服务器发送请求数据的超时时间。 - fastcgi_read_timeout: 设置从
FastCGI
后端服务器读取响应数据的超时时间。
上述配置可配置于 http
模块或 location
模块,配置于前者则全局生效,当 location
模块与 http
模块配置冲突时以 location
模块配置为准。
http {
# 设置与后端服务器的连接超时时间为 30 秒
proxy_connect_timeout 30s;
# 设置向后端服务器发送请求数据的超时时间为 30 秒
proxy_send_timeout 30s;
# 设置从后端服务器读取响应数据的超时时间为 30 秒
proxy_read_timeout 30s;
# 设置与 FastCGI 后端服务器的连接超时时间为 30 秒
fastcgi_connect_timeout 30s;
# 设置向 FastCGI 后端服务器发送请求数据的超时时间为 30 秒
fastcgi_send_timeout 30s;
# 设置从 FastCGI 后端服务器读取响应数据的超时时间为 30 秒
fastcgi_read_timeout 30s;
}
3. 缓存配置
(Ⅰ) 请求配置参数(作用于客户端与代理服务器之间)
- client_max_body_size:用于限制客户端向
nginx
发送请求的body
大小(即POST
的请求体大小),默认值为1MB
。 - client_body_buffer_size:当客户端发送请求时,请求体的数据需要先缓冲到
nginx
的内存中,然后再转发给后端服务器,该参数用于指定缓冲请求体的内存大小,默认根据操作系统的页大小来自动设置缓冲区大小。 - client_header_buffer_size:用于限制客户端请求头的大小,默认值为
1 KB
。可以根据需要将其设置为适当的值,如client_header_buffer_size 4k
表示允许的请求头大小为4 KB
。 - large_client_header_buffers:用于设置用于存储客户端请求头的缓冲区大小,默认值为
4 8k
,即使用4
个8KB
的缓冲区来存储请求头。
(Ⅱ) 代理配置参数(作用于代理服务器与后端服务之间)
- proxy_buffers:用于设置代理响应的缓冲区数量和大小,默认情况下
nginx
使用4
个8 KB
的缓冲区来存储代理响应。 - proxy_buffer_size:当
nginx
作为反向代理服务器向后端服务器请求数据时,会先将响应数据存储到内存缓冲区中,参数决定了代理服务器一次从后端服务读取的数据量大小。 - proxy_max_temp_file_size:当
nginx
作为反向代理服务器向后端服务器请求数据时,如果缓冲区的大小不足以存储响应数据,那么nginx
会将数据暂存到临时文件中,设置为 0 则禁用临时文件。 - proxy_busy_buffers_size:当
nginx
代理模块将响应数据传输给客户端时,如果传输数据大小超过了参数配置大小,nginx
将会暂停从后端服务接收响应数据,直到客户端读取了足够的数据将缓冲区腾出来。
在配置代理参数时需要注意下列事项:
proxy_max_temp_file_size
值需要等于或大于proxy_buffers
与proxy_buffer_size
中的最大值。proxy_busy_buffers_size
值需要等于或大于proxy_buffers
与proxy_buffer_size
中的最大值。
http {
client_max_body_size 128m;
client_body_buffer_size 10m;
proxy_buffers 4 10m;
proxy_buffer_size 10m;
proxy_max_temp_file_size 15m;
proxy_busy_buffers_size 15m;
}
五、请求头配置
1. 请求配置
add_header
配置的请求头作用于客户端与代理服务器期间。
location {
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header Access-Control-Allow-Origin http://127.0.0.1;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Credentials 'true';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
}
2. 代理配置
proxy_set_header
配置的请求头作用于代理服务器与后端服务器期间。
location {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
# 后端的 Web 服务器可以通过 X-Forwarded-For 获取用户真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
六、负载均衡
负载均衡即通过一定的算法机制,将接收请求的分发至集群中不同服务节点,从而降低单台服务器的压力,而通过 Nginx
即可实现便捷的负载均衡配置。
1. 负载类型
Nginx
代理中针对不同的应用场景提供了一系列负载均衡配置算法,常用的类型包含下述六类。
(1) 基础轮询
基础轮询默认所有服务器权重为 1
。
upstream host_list {
server 192.168.0.20:8080
server 192.168.0.21:8080
server 192.168.0.22:8080
}
(2) 加权轮询
加权轮询可以为每个节点单独指定权重,权重越高服务负载越高,未指定权重时默认为 1
。
upstream host_list {
server 192.168.0.20:8080 weight=3
server 192.168.0.21:8080 # default weight=1
server 192.168.0.22:8080 # default weight=1
}
(3) 最少连接
根据当前活跃连接数选择负载更少的后端服务器来分配请求,从而实现负载均衡。
upstream host_list {
least_conn;
# with default weight for all (weight=1)
server 192.168.0.20:8080
server 192.168.0.21:8080
server 192.168.0.22:8080
}
(4) 加权最少连接
在最少连接的负载前提下同时指定节点的权重。
upstream host_list {
least_conn;
server 192.168.0.20:8080 weight=3
server 192.168.0.21:8080 # default weight=1
server 192.168.0.22:8080 # default weight=1
}
(5) 普通 Hash
普通Hash
是将每个请求按照其某个固定的属性(如 URL
等)计算出一个哈希值,并将其分配给相应的服务器进行处理。这种方式可以确保相同的请求总是被分配给同一个服务器,避免了因服务器动态上下线而导致的请求重复路由的问题。
upstream host_list {
hash $request_uri;
# with default weight for all (weight=1)
server 192.168.0.20:8080
server 192.168.0.21:8080
server 192.168.0.22:8080
}
(6) IP Hash
IP Hash
则是在 普通Hash
的基础上,加入了客户端 IP
地址的因素。它会根据客户端 IP
地址进行哈希计算,从而保证来自同一个 IP
地址的请求总是被分配给同一个服务器进行处理。
upstream host_list {
ip_hash;
# with default weight for all (weight=1)
server 192.168.0.20:8080
server 192.168.0.21:8080
server 192.168.0.22:8080
}
2. 参数配置
在配置服务均衡时除了可以指定节点权重外 nginx
还提供了其它参数,详细介绍参考下表:
参数 | 作用 |
---|---|
weight | 标识服务器节点的权重,权重越高负载则越高。 |
backup | 标识是否为备用服务器,当所有的非备用服务器都不可用时请求会发送给备用节点。 |
down | 标识服务器是否不参与负载,通常用于服务下线停机维护时。 |
max_conns | 设置最大活动链接数,防止请求过高导致宕机,当设置为 0 时表示无限制。 |
max_fails | 设置允许请求代理服务器最大的失败次数。 |
fail_timeout | 服务器在经过 max_fails 次失败后服务器暂停的时间,默认 10 秒。 |
3. 负载示例
下述是一个完整的 Nginx
负载配置示例,相应的配置文件如下:
http {
# 设定负载均衡的服务器列表
upstream host_list {
# weigth 参数表示权值,权值越高被分配到的几率越大
server 192.168.0.20:80 weight=1;
server 192.168.0.21:80 weight=2;
server 192.168.0.22:80 weight=3;
}
server {
listen 80;
server_name www.helloworld.com;
# 对所有请求进行负载均衡请求
location / {
root /root;
index index.html index.htm;
# 请求转向 host_list 定义的服务器列表
proxy_pass http://host_list ;
}
}
}