1 环境部署
1.1 关键概念
-
安装方式:二进制方式安装和源码编译安装
-
依赖环境:源码编译时需要具备编译环境。
Ubuntu编译环境准备:
apt install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssldev libsystemd-dev zlib1g-dev
apt install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database libgeoip-dev
rocky9编译环境准备:
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssldevel systemd-devel zlib-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel
1.2 操作步骤
1.2.1 二进制安装-ubuntu
查看nginx安装包列表
apt list nginx -a

使用root安装nginx
apt install -y nginx


安装相关依赖包
apt install nginx-core fcgiwrap nginx-doc


查看nginx服务状态
systemctl status nginx

查看80端口状态
netstat -anp | grep 80

1.2.2 二进制安装-rocky9
查看nginx安装包列表

使用root安装nginx(默认情况下,会安装依赖包nginx-core、nginx-filesystem、rocky-logos-httpd)

检查状态

设置为开机自启动,并查看状态

查看80端口状态

1.2.3 源码编译安装-ubuntu
编译环境准备
apt install build-essential gcc g++ libc6 libc6-dev libpcre3 libpcre3-dev libssl-dev libsystemd-dev zlib1g-dev
apt install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database libgeoip-dev

创建运行用户

下载源码并解压(如果出现无法解析主机地址nginx.org,重新尝试下载即可。)
wget https://nginx.org/download/nginx-1.22.1.tar.gz


定制配置
cd nginx-1.22.1
./configure --prefix=/data/server/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module


编译并安装
make && make install

修改目录属主属组并查看
chown -R nginx:nginx /data/server/nginx/

创建软链接
ln -sv /data/server/nginx/sbin/nginx /usr/sbin/nginx

查看版本

man手册导入
cp man/nginx.8 /usr/share/man/man8/
mandb

查看效果
whereis nginx

定制服务管理文件
创建pid目录并授权
mkdir /data/server/nginx/run
chown -R nginx:nginx /data/server/nginx/run
修改配置文件,设置pid文件路径

创建nginx服务脚本(如果pid文件路径不一样,会导致nginx服务无法启动)
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/data/server/nginx/run/nginx.pid
ExecStart=/data/server/nginx/sbin/nginx -c /data/server/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target

重载服务脚本并启动服务,查看状态
systemctl daemon-reload
systemctl start nginx
systemctl status nginx

查看80端口

1.2.4 源码编译安装-rocky9
编译环境安装
yum install gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel



下载源码安装包
wget https://nginx.org/download/nginx-1.23.0.tar.gz

解压

创建运行用户
useradd -r -s /usr/sbin/nologin nginx
定制配置
cd nginx-1.23.0
./configure --prefix=/data/server/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module


编译并安装
make && make install

修改文件属性
chown -R nginx:nginx /data/server/nginx/
启动nginx并查看效果

添加环境变量,即可在任意目录下执行相关命令
echo "export PATH=/data/server/nginx/sbin:$PATH" >> /etc/bashrc
source /etc/bashrc

添加man文档
cd nginx-1.23.0/
cp man/nginx.8 /usr/share/man/man8/
查看80端口

1.3 核心配置示例

-
conf.d #子配置文件目录,在主配置文件中被包含,默认为空
-
fastcgi.conf #FastCGI配置文件,定义相关配置项,被引用
-
fastcgi_params #FastCGI配置文件,定义相关配置项,被引用
-
koi-utf #用于转换KOI8-R编码的字符集到UTF-8
-
koi-win #用于转换KOI8-U编码的字符集到UTF-8
-
mime.types #包含文件扩展名和相应MIME类型的映射
-
modules-available #模块配置文件目录
-
modules-enabled #当前生效的模块配置文件目录,用软链接指向真正的文件
-
nginx.conf #主配置文件
-
proxy_params #反向代理配置文件
-
scgi_params #SCGI配置文件,SCGI和FastCGI类似,都是一种协议
-
sites-available #所有域名配置文件
-
sites-enabled #生效的域名配置文件,用软连接指向site-available中的文件
-
snippets #通用的配置片段目录,需要时被引用
-
uwsgi_params #配置 Nginx uWSGI 模块的默认参数的文件
-
win-utf #编码转换映射转化文件
2 配置结构
2.1 关键概念
2.1.1 层级结构
全局块 → events 块 → http 块 → server 块 → location 块
2.2.2 配置文件格式
-
配置文件由指令与指令块构成
-
每条指令以 ; 分号结尾,指令与值之间以空格符号分隔
-
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
-
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
-
include 语句允许组合多个配置文件以提升可维护性
-
使用 # 号添加注释,提高可读性
-
使用 $ 符号使用变量
-
变量分为 Nginx 内置变量和自定义变量,自定义变量用 set 指令定义
-
部分指令的参数支持正则表达式
2.2.3 完整配置结构
# --- 全局配置段 ---
user ...;
worker_processes ...;
...
# --- 事件驱动相关的配置 ---
events {
...;
}
# --- http/https 协议相关配置段 ---
http {
...;
server {
...;
location {
...;
}
}
}
# --- mail 协议相关配置段,默认被注释 ---
mail {
server {
...
}
}
# --- stream 协议相关配置 ---
stream {
...;
}
2.2 操作步骤
2.2.1 全局块
针对nginx软件的相关配置,是正常运行的必备配置。如工作进程数、日志路径等。
全局配置常用配置项
user user [group]; #指定 worker 进程运行时的用户和组,默认值为 nobody nobody
worker_processes auto|N; #指定启动的 worker 进程数量,N 表示具体数字,auto 表示根据CPU核心自由确定就开启几个进程
worker_cpu_affinity auto|cpumask; #将 worker 进程绑定到指定的CPU核心,提升性能,默认不绑定,auto 表示自动绑定,nginx 1.9.10 版本开始支持 cpumask 写法,有几颗CPU核就写几个数字,默认是0,表示占位符,从右往左数,如果占位符值为1,则表示绑定
pid /path/file; #pid 文件路径,该文件中保存的是 master 进程号,服务启动时自动生成该文件
worker_priority N; #worker 进程优先级,默认值为0,此处设定的是 nice 值,取值为 -20 到 19
worker_rlimit_nofile N; #所有 worker 进程可以打开的文件描述符数量之和,默认不限制。此值并不仅仅是指nginx 与客户端的连接数,包括与后端服务的连接数。比如一个客户端请求一个PHP资源,Nginx要维持与客户端连接,也要维持后端 FastCGI 连接
daemon on|off; #默认值为 on, 表示以后台守护进程方式运行,off 表示前台运行
master_process on|off; #默认值为 on, 表示以 master-worker 模式运行,off 只有 master 进程,用于开发调试
include /path/file; #文件包含,指定要包含的文件路径及规则,可以使用通配符
2.2.2 event块
针对高并发的相关配置,如并发连接数等
evnets 配置常用配置项
events {
worker_connections N; #默认值512,单个 worker 进程所支持的最大并发连接数,总的并发数用此值乘以 worker 进程数
multi_accept on|off; #默认值 off,on 表示 worker 进程一次可以接收多个新的连接请求,off 表示 worker 进程,一次只能接收一个新连接,建议设置为 on
accept_mutex on|off; #默认值 off,表示 master 进程获得客户端请求后,会通知所有的 worker 进程,由当前状态最佳的 worker 进程处理请求,此过程也被称为惊群,on 表示 master 进程轮流给 worker 进程分配要处理的连接,此处建议设置为 on
use method; #指定事件驱动模型,默认不设置此项,nginx 会根据当前系统自行选择。可用值select|pool|kqueue|epoll|/dev/poll|eventport
}
2.2.3 http块
在 Nginx 的配置文件中,http 指令用来配置 HTTP 服务器的全局设置和参数, http 配置段中
包括 http 的全局配置,多个 location 配置,多个 server 配置等,其中 server 用来配置虚拟主
机。
http 配置常用配置项
charset charset|off; #是否在响应头 Content-Type 行中添加字符集,默认 off
sendfile on|off; #默认值 off,on表示使用 sendfile 函数来传送数据,即零拷贝
tcp_nopush on|off; #默认值 off,表示立即发送,on 表示等到数据包满载了再发送,on 要配合 sendfile on 一起使用
tcp_nodelay on|off; #依赖 keepalived,默认值 on 表示立即发送数据,off 表示延时0.2S发送数据
keepalive_timeout timeout [header_timeout]; #会话保持的时长,单位为秒,第二个值会出现在响应头中,可以和第一个值不一样
types_hash_max_size N; #默认值1024,用于设置 MIME 类型哈希表大小,nginx 使用 MIME 类型哈希表来加速 MIME 类型的查找过程,提高性能
server_tokens on|off|build|string; #默认值on,是否在响应头中显示 nginx 信息,off 表示不显示
server_names_hash_bucket_size N; #默认值32|64|128,默认值具体取决于服务器缓存大小,
server_name_in_redirect on|off; #默认值off,表示在重定向时响应头中不包含 Server 行,on 表示显示 Server 头
include /etc/nginx/mime.types; #规定了各种后缀文件在响应报文中的 Content-Type对应的值
default_type application/octet-stream; #除了上述映射外,其它类型文件都用此值
ssl_protocols [SSLv2] [SSLv3] [TLSv1|.1|.2|.3]; #当前nginx 可支持的 ssl协议版本。默认值 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3
ssl_prefer_server_ciphers on|off; #默认off,表示在 SSL/TLS 握手时优先使用客户端加密套件,on 表示优先使用服务端套件
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; #访问日志的文件路径、格式以及其他一些选项。默认值 logs/access.log combined,禁用访问日志写成 access_log off; path 指定文件路径,format 指定日志格式,不指定格式则使用预定义的 combined。buffer=size 设置缓冲区大小,可以异步写。gzip[=level] 启用gzip压缩,可以指定压缩比。if=condition 设置条件,仅在满足时记录日志
error_log file [level]; #指定错误日志路径和错误级别,可用级别包括ebug|info|notice|warn|error|crit|alert|emerg
error_page code ... [=[response]] uri; #定义指定状态码的错误页面,可以多个状态码共用一个资源
gzip on|off; #是否使用gzip 压缩数据后再传输,默认off
gzip_vary on|off; #在启用了压缩的情况下,是否在响应头中添加 Vary: Accept-Encoding 行,默认off
gzip_proxied off|expired|no-cache|nostore|private|no_last_modified|no_etag|auth|any ...; #是否对后端服务器的返回结果进行压缩,默认 off
gzip_comp_level N; #设置压缩比,取值1-9,默认 1
gzip_buffers number size; #设置用于gzip压缩的缓存空间大小,用 number * size,默认值 32 4k|16 8k 。size 取值为系统内存页大小,与当前操作系统和平台有关
gzip_http_version N; #用于设置开启gzip 压缩的http 协议的早小版本,默认值 1.1,因为有些客户端或浏览器不支持gzip压缩
gzip_types mime-type ...; #根据 MIME 来决定是否对数据进行压缩,默认值 text/html
2.2.4 server块
server 主要用来配置虚拟主机,可以在一台 web 服务器上支持多个域名,一个 server 配置段中可
以有多个 location 配置。
server 配置常用配置项
listen address[:port] [default_server] [ssl]; #当前虚以主机监听的ip,port,是否是default_server,是否支持ssl
listen port [default_server] [ssl];
listen unix:path [default_server] [ssl];
ssl_certificate file; #当前虚拟主机证书和CA机构证书,放在一个文件中,默认值为空
ssl_certificate_key file; #私钥文件路径,默认为空
ssl_session_cache off|none|[builtin[:size]] [shared:name:size]; #是否启用 ssl 缓存,默认none, off 不使用 ssl 缓存。none 通知客户端,当前支持 ssl session cache。builtin[:size]使用 openssl 内建缓存,为每个worker 进程私有。shared:name:size woker 进程共享缓存
ssl_session_timeout N; #客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
ssl_ciphers ciphers; #指定 SSL/TLS 加密算法,默认值 HIGH:!aNULL:!MD5; #默认值表示加密优先级高,排除匿名加密算法,排除 MD5 加密算法
ssl_prefer_server_ciphers on|off; #默认off,表示在SSL/TLS握手时优先使用客户端加密套件,on 表示优先使用服务端套件
root path; #当前虚拟主机网页文件目录,写在location中,文件路径是 root+location
index file ...; #当前虚拟主机的默认页面,可以写多个,按顺序生效,默认 index.html
server_name name ...; #虚拟主机域名,可以写多个值,客户端请求头中的 Host 字段会与此处匹配。默认值是"",用来匹配请求头中 Host 字段值为空的请求。还可以写成 _,@ 等用来表示无效域名,和listen中的default_server配合
2.2.5 location块
location 块是 Server 配置段中的关键部分,用于进一步细分对虚拟主机的请求处理规则。location 块可以基于请求的 url 进行匹配,并根据匹配结果执行相应的处理指令。
location 配置常用配置样式
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
location 配置常用匹配规则
= #用于标准uri前,需要请求字串与uri精确匹配,区分大小写
^~ #用于标准uri前,表示包含正则表达式,匹配以特定字符串开始,区分大小写
~ #用于标准uri前,表示包含正则表达式,区分大小写
~* #用于标准uri前,表示包含正则表达式,不区分大写
/str #不带符号 匹配以 str 开头的 uri,/ 也是一个字符
\ #用于标准uri前,表示包含正则表达式并且转义字符,可以将 . * ?等转义为普通符号
@name #定义
location 配置常用配置项
alias path; #定义路径别名,把访问路径重新映射到其它目录
root path; #定义网站在文件系统上的家目录,server_root/location_root
index file ...; #当前配置段的默认页面,可以写多个,依次生效,默认 index.html
return code [text]|code URL|URL; #直接给客户端返回状态码+字符串或URL
proxy_pass URL; #设置反向代理,将符合规则的请求转发到后端服务器进行处理
fastcgi_pass address; #通过fastCGI协议将请求转发到后端服务器进行处理
fastcgi_index name; #fastCGI协议的默认资源,默认为空
fastcgi_param parameter value [if_not_empty]; #设置传给fastCGI服务器的参数 key value 格式
deny address|CIDR|unix:|all; #拒绝访问的客户端,黑名单
allow address|CIDR|unix:|all; #允许访问的客户端,白名单,可以是具体IP
try_files file ... uri|file ... =code; #按顺序查询文件是否存在,并返回匹配到的信息
2.3 核心配置示例



3 核心功能1-反向代理
3.1 关键概念
客户端请求先发送到 Nginx,Nginx 再转发到后端服务(如 Tomcat、Node.js),客户端无法直接感知后端服务地址,实现 “隐藏后端、统一入口”。Nginx 可以基于ngx_http_proxy_module 模块提供 http 协议的反向代理服务,该模块是 Nginx 的默认模块。
3.1.1 特点
-
代理服务器位于目标服务器和客户端之间
-
客户端向代理服务器发送请求,代理服务器将请求转发给一个或多个目标服务器,并将其中一个目标服务器的响应返回给客户端
-
目标服务器不知道最终客户端的身份,只知道有一个代理服务器向其发送请求
-
-用于将客户端的请求分发给多个服务器,实现负载均衡
3.1.2 用途
-
负载均衡:通过将流量分发到多个服务器,确保服务器的负载均匀分布
-
缓存和加速:反向代理可以缓存静态内容,减轻目标服务器的负载,并提高访问速度
-
安全性:隐藏真实服务器的信息,提高安全性,同时可以进行 SSL 终止(SSL Termination)
3.1.3 常用配置项
proxy_pass URL; #转发的后端服务器地址,可以写主机名,域名,IP地址,也可以额外指定端口,作用域 location, if in location, limit_except
proxy_pass_header field; #显式指定要回传给客户端的后端服务器响应头中的字段
proxy_pass_request_body on|off; #是否向后端服务器发送客户端 http 请求的 body 部份,默认 on
proxy_pass_request_headers on|off; #是否向后端服务器发送客户端 http 请求的头部信息,默认 on
proxy_hide_header field; #Nginx 默认不会将后端服务器的 Date,Server,Xxxx... 这些响应头信息传给客户端,除了这些之外的响应头字段会回传,可以使用 proxy_hide_header 显式指定不回传的响应头字段
proxy_connect_timeout time; #Nginx与后端服务器建立连接超时时长,超时返回504
proxy_read_timeout time; #Nginx 等待后端服务器返回数据的超时时长,超时返回504
proxy_send_timeout time; #Nginx 向后端服务器发送请求的超时时长,超时返回408
proxy_set_body value; #重新定义传给后端服务器的请求的正文,可以包含文本,变量等
proxy_set_header field value; #更改或添加请求头字段并发送到后端服务器
proxy_http_version 1.0|1.1; #设置向后端服务器发送请求时的 http 协议版本,默认值 1.0
proxy_ignore_client_abort on|off; #客户端中断连接,Nginx 是否继续执行与后端的连接,默认值 off,客户端中断,nginx 也会中断后端连接,on 表示 客户端中断,nginx 还会继续处理与后端在连接
proxy_headers_hash_bucket_size size; #当配置了 proxy_hide_header 和 proxy_set_header 的时候,用于设置 nginx 保存 HTTP 报文头的 hash 表的大小,默认值 64
proxy_headers_hash_max_size size; #上一个参数的上限,默认值 512
proxy_next_upstream error|timeout|invalid_header|...| off ...; #当前配置的后端服务器无法提供服务时,去请求下一个后端服务器。默认值 error timeout,表示因超时错误时,去请求
3.2 操作步骤
定制配置文件
server {
listen 80 default_server;
root /data/server/nginx/web1;
location / {
proxy_pass http://10.0.0.114:81; # 交给后端的81端口服务
proxy_connect_timeout 2s; # 设置连接超时时间为2s
}
location /1 {
proxy_pass http://10.0.0.114:88; # 交给后端的88端口服务
}
}
server {
listen 81 default_server;
root /data/server/nginx/web2;
access_log /var/log/nginx/access_client.log;
}
重启服务并测试,如果后端服务不可用,从客户端访问会返回 502

防火墙禁止81端口被访问,再次测试,连接后端服务器超时,会报 504

3.3 核心配置示例

4 核心功能2-负载均衡
4.1 关键概念
4.1.1 简介
Nginx是一个高性能的开源Web服务器和反向代理服务器,其负载均衡功能是其核心特性之一。负载均衡是一种分布式计算技术,用于将网络流量和用户请求分散到多台服务器上,以此来提高网络服务的可用性和可靠性。它通过优化资源使用、最大化吞吐量以及最小化响应时间,增强了网络、服务器和数据中心的伸缩性和灵活性。
4.1.2 工作原理
Nginx的负载均衡功能主要通过其反向代理模式实现。当客户端发送请求到Nginx服务器时,Nginx会根据预设的负载均衡策略将请求转发给后端服务器,并将后端服务器的响应返回给客户端。Nginx作为代理服务器,有效地分摊了请求压力,提高了系统的处理能力。
4.1.3 工作特点
-
提高可用性:通过将请求分散到多个服务器,即使部分服务器出现故障,整个系统仍然可以继续提供服务。
-
增强性能:负载均衡可以提高系统处理大量并发请求的能力,从而提升整体性能。
-
故障转移:当一台服务器发生故障时,负载均衡器可以自动将流量转移到其他健康的服务器上,以避免服务中断。
-
降低延迟:通过选择最佳的服务器来处理请求,减少数据传输的延迟。
-
资源优化:合理分配请求到各个服务器,避免某些服务器过载而其他服务器空闲,优化资源使用。
4.1.4 配置解读
核心配置
upstream name { server address [parameters]; } # 定义一个后端服务器组,可以包含多台服务器,定义好后在 proxy_pass 指令中引用(作用域 http)。
server address [parameters] #在 upstream 中定义一个具体的后端服务器(作用域upstream)。address : 指定后端服务器,可以是IP地址|主机名|Socket
parameters 可选参数属性
weight=number #指定该 server 的权重,默认值都是1
max_conns=number #该 Server 的最大活动连接数,达到后将不再给该 Server 发送请求,可以保持的连接数=代理服务器的进程数乘以max_conns,默认值0,表示不限制
max_fails=number #后端服务器的下线条件,后端服务器连续进行检测多少次失败,而后标记为不可用,默认为1。当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,后端服务器连续进行检测多少次成功,而后标记为可用,默认为10秒
backup #标记该 Server 为备用,当所有后端服务器不可用时,才使用此服务器
down #标记该 Server 临时不可用,可用于平滑下线后端服务器,新请求不再调度到此服务器,原有连接不受影响
负载均衡调度算法配置属性
hash key [consistent]; # 使用自行指定的 Key 做 hash 运算后进行调度,Key 可以是变量,比如请求头中的字段,URI等,如果对应的server条目配置发生了变化,会导致相同的 key 被重新 hash。consistent 表示使用一致性 hash,此参数确保该 upstream 中的 server 条目发生变化时,尽可能少的重新 hash,适用于做缓存服务的场景,提高缓存命中率(作用域 upstream)
ip_hash; # 源地址hash调度方法,基于的客户端的remote_addr做hash计算,以实现会话保持,作用域 upstream
least_conn; # 最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的 LC 算法,配合权重,能实现类似于 LVS 中的 WLC 算法(作用域 upstream)
keepalive connections; # 为每个 worker 进程保留最多多少个空闲保活连接数,超过此值,最近最少使用的连接将被关闭,默认不设置(作用域 upstream)
keepalive_time time; # 空闲连接保持的时长,超过该时间,一直没使用的空闲连接将被销毁。默认值 1h(作用域 upstream)
4.2 操作步骤
4.2.1 角色分配
| 角色 | IP | 系统 |
|---|---|---|
| Client | 10.0.0.15 | rocky9 |
| Proxy Server | 10.0.0.113 | ubuntu24 |
| Real Server - 1 | 10.0.0.113 | ubuntu24 |
| Real Server - 2 | 10.0.0.118 | openEuler |
4.2.2 Proxy Server 配置定制
登录 Proxy Server,编辑 /etc/nginx/conf.d/vhost.conf
upstream group1 {
server 10.0.0.114;
server 10.0.0.118;
}
server {
listen 80 default_server;
location / {
proxy_pass http://group1;
}
}
重启 nginx
systemctl restart nginx
4.2.3 Real Server - 1 配置定制
登录 Real Server - 1,编辑 /etc/nginx/conf.d/vhost.conf
server {
listen 80 default_server;
location / {
return 200 "RealServer-1\n";
}
}
重启 nginx
systemctl restart nginx
4.2.4 Real Server - 2 配置定制
登录 Real Server - 2,编辑 /etc/nginx/default.d/simple.conf
location / {
return 200 "RealServer-2\n";
}
重启 nginx
systemctl restart nginx
4.2.5 负载均衡效果测试
登录客户端进行测试

客户端访问,轮循调度到后端服务器
4.3 核心配置示例
Proxy Server 配置

Real Server - 1 配置

Real Server - 2 配置

5 核心功能3-HTTPS
5.1 关键概念
5.1.1 简介
Nginx 中的 Https 功能需要 ngx_http_ssl_module 模块支持,使用 Yum/apt 安装的 Nginx 中己经包含了该模块的功能,如果使用的是自行通过源码编译安装的 Nginx,需要在编译的时候指定相关编译项。
5.1.2 配置解析
ssl on|off; #是否启用SSL,1.15版本中被弃用,1.25.1版本中被删除
ssl_buffer_size size; #Nginx在读取和写入SSL/TLS握手数据时使用的缓冲区大小,无关数据发送,默认值 16k,作用域 http, server
ssl_certificate file; #当前虚拟主机的证书文件,通常是PEM格式,该文件中有两部份,分别是虚拟主机的证书和CA机构的证书,作用域 http, server
ssl_certificate_key file; #当前虚拟主机的私钥文件路径,作用域 http, server
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3]; #当前支持的SSL协议版本,默认值 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3,作用域 http, server
ssl_session_cache off|none|[builtin[:size]] [shared:name:size]; #配置SSL缓存,作用域 http, server。off 禁用SSL/TLS会话缓存。none 通知客户端可以重用会话,但并没有缓存相关数据,默认值。builtin[:size] 使用OpenSSL内建缓存,可指定大小,每个 worker 进程独享。[shared:name:size] 使用共享缓存,每个worker进程共享该缓存中的数据,可指定name和大小
ssl_session_timeout time; #配置SSL/TLS会话缓存的超时时间,默认值 5m,作用域 http,server
5.1.3 SSL功能解读
使用 SSL/TLS 会话缓存有助于减少服务器的加密和解密负担,提高 HTTPS 连接的响应速度,启用缓存需要 ssl_session_cache,ssl_session_timeout 两个选项一起使用。
SSL/TLS 会话缓存存储的是 SSL/TLS 握手过程中生成的会话数据。在 SSL/TLS 握手过程中,服务器和客户端会交换一系列数据,其中包括协商的密钥、加密算法、会话标识符等信息。这些信息用于确保安全通信,并在建立连接后用于加密和解密通信的数据。
SSL/TLS 会话缓存中存储的主要数据包括 会话标识符(Session Identifier),主密钥(Master Secret),加密算法和参数。
通过存储这些会话数据,SSL/TLS 会话缓存允许服务器在处理新连接时,如果客户端提供了先前使用过的会话标识符,就可以重用这些数据,避免重新执行完整的 SSL/TLS 握手。这样可以大幅度减少握手过程中的计算和通信开销,提高性能和响应速度。同时,它还有助于减少服务器的负担,因为不需要重新生成新的密钥和协商参数。
5.2 操作步骤
5.2.1 秘钥环境准备
安装软件包
apt install easy-rsa -y

创建密钥
cd /usr/share/easy-rsa/
./easyrsa init-pki

查看效果

5.2.2 实现自签证书
生成CA机构证书,不使用密码
./easyrsa build-ca nopass

5.2.3 网站签名请求
生成私钥和证书申请文件
./easyrsa gen-req ubuntu.test.com nopass

签发证书
./easyrsa sign-req server ubuntu.test.com

5.2.4 合并证书
合并服务器证书、签发机构证书为一个文件,注意顺序
cat pki/issued/ubuntu.test.com.crt pki/ca.crt > pki/ubuntu.test.com.pem

给私钥加读权限
chmod +r pki/private/ubuntu.test.com.key

查看效果

5.2.5 定制 nginx ssl 配置
定制配置文件
server {
listen 80 default_server;
server_name ubuntu.test.com;
root /data/server/nginx/web1;
# return 301 https://$host$request_uri; # 301重定向
rewrite ^(.*) https://\$server_name\$1 permanent; #rewrite 重定向,二选一
}
server{
listen 443 ssl;
server_name ubuntu.test.com;
root /data/server/nginx/web1;
# 定制ssl的能力
ssl_certificate /usr/share/easy-rsa/pki/ubuntu.test.com.pem;
ssl_certificate_key /usr/share/easy-rsa/pki/private/ubuntu.test.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
重启 nginx
systemctl restart nginx
5.2.6 https 效果测试


下载证书到windows主机
/usr/share/easy-rsa/pki/ca.crt
查看证书信息


安装证书

再次查看证书

windows主机配置 hosts,添加 10.0.0.114 ubuntu.test.com

浏览器访问域名,查看效果

5.3 核心配置示例

6 核心功能4-防盗链
6.1 关键概念
6.1.1 简介
盗链是指某站点未经允许引用其它站点上的资源。基于访问安全考虑,Nginx 支持通过ngx_http_referer_module 模块,检查和过滤 Referer 字段的值,来达到防盗链的效果。
HTTP Referer 是 Header 的一部分,当浏览器向 Web 服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如校验加载图片、文件等来源是否是指定域名,如不是则禁止访问。因此 HTTP Referer 头信息是可以通过程序来伪装生成的,所以通过 Referer 信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。
6.1.2 配置解析
valid_referers none |blocked|server_names|string ...;
#Nginx 会使用请求头中的 referer 字段值和 valid_referers 指定的规则进行对比,如果不匹配,会将 $invalid_referer 变量的值设为 1,默认该变量值为空字符串,作用域 server, location。
#none : 如果请求头中没有 referer 字段,则 $invalid_referer 变量值为空
#blocked : 如果请求头中有 referer 字段,但其值不合法(不是以 http 或 https 开头),则$invalid_referer 变量为空
#server_names : 具体主机名,可以写一个或多个,支持正则和通配符,如果请求头中的 referer 字段值与定义的 server_names 匹配,则$invalid_referer 变量为空
6.2 操作步骤
6.2.1 盗链演示
上传图片到nginx静态目录 /data/server/nginx/web1/static/

定制访问界面 /data/server/nginx/web2/index.html、/data/server/nginx/web3/index.html
<img src="http://10.0.0.114:81/static/1.png" width="40" height="40" />

定制配置文件 /etc/nginx/conf.d/vhost.conf
server {
listen 80 default_server;
root /data/server/nginx/web2;
}
server {
listen 81 default_server;
root /data/server/nginx/web1;
}

重启nginx
systemctl restart nginx
当访问者在浏览器中打开 10.0.0.114/index.html 时,该页面会引用一个 http://10.0.0.114:81 站点的图片资源。而对于http://10.0.0.114:81 站点而言,其资源就是被资链了。

6.2.2 实现防盗链
利用 valid_referers 指令实现防盗链,定制配置文件 /etc/nginx/conf.d/vhost.conf
server {
listen 80 default_server;
root /data/server/nginx/web2;
}
server {
listen 81 default_server;
root /data/server/nginx/web1;
# 请求头中没有 referer 或 值不合法,server_name 中以:82、.baidu.、.bing.或.so.开头的域名,则 $invalid_referer 变量为空,除此之外将 $invalid_referer 变量的值设为 1
valid_referers none blocked server_names ~:82 ~\.baidu\. ~\.bing\. ~\.so\.;
# 如果\$invalid_referer值不为空,就返回403
if ($invalid_referer){
return 403 "Forbidden Access";
}
}
server {
listen 82 default_server;
root /data/server/nginx/web3;
}
重启nginx
systemctl restart nginx
如果有报错提示 open() "/data/server/nginx/web1/favicon.ico" failed (2: No such file or directory)

可获取相关文件
wget https://www.logosc.cn/uploads/output/2021/10/19/aaabb9adc7fad4ed3268b7e5ce05ba37.jpg -O /data/server/nginx/web1/static/favicon.ico

再次重启后浏览器测试效果
单独访问 http://10.0.0.114:81/static/1.png 是可以正常访问的。

访问 10.0.0.114/index.xml ,图片资源无法正常加载

访问 10.0.0.114:82,图片资源正常加载,因为它的 valid_referers 符合 :82 的需求

6.3 核心配置示例

7 平滑升级
7.1 相关概念
7.1.1 简介
Nginx 的平滑升级是指在不中断服务的情况下进行软件版本或配置文件的更新。通过平滑升级,Nginx 能够在运行时应用新的配置或软件版本,继续处理请求,而不影响现有的连接。
7.1.2 优势
允许 Nginx 在更新时保持对服务的连续响应,避免中断用户的请求,这对于具有高可用性要求的生产环境非常重要,然而,需要注意的是,平滑升级并不适用于所有场景,特别是在某些配置或软件更改可能导致不兼容性问题的情况下,在进行平滑升级之前,建议先在测试环境中进行充分的测试。
7.2 操作步骤
7.2.1 查看当前环境
查看当前版本及编译选项
nginx -V

查看 worker 进程数量,确保至少有两个 worker 进程在运行

如果不够,通过 worker_processes 指定 worker 进程数量
7.2.2 新版本安装
下载新版本源码包,升级不要跨越多个大版本
wget http://nginx.org/download/nginx-1.25.0.tar.gz

解压文件
tar -zxvf nginx-1.25.0.tar.gz

基于旧的 nginx 配置,来编译安装新版本软件(替换版本号)
./configure --with-cc-opt='-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx-WLuzPu/nginx-1.25.0=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=/build/nginx-WLuzPu/nginx-1.25.0=/usr/src/nginx-1.25.0-2ubuntu7.5 -fPIC -Wdate-time -D_FORTIFY_SOURCE=3' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=stderr --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-mail_ssl_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with-http_perl_module=dynamic --with-http_xslt_module=dynamic --with-mail=dynamic --with-stream=dynamic --with-stream_geoip_module=dynamic


编译生成对应的文件,注意只执行 make,不要执行 make install

可能遇到的问题
编译报错,提示
make[1]: *** [objs/Makefile:1584: objs/ngx_http_perl_module.so] Error 1

原因:库文件都是携带版本号的,编译的时候,很多是不带版本号的

解决方法:创建软连接
ln -s /usr/lib/x86_64-linux-gnu/libperl.so.5.38 /usr/lib/x86_64-linux-gnu/libperl.so
7.2.3 新旧版本切换
环境检查,查看新旧环境的nginx版本

查看新旧版本执行文件
ll ./objs/nginx /usr/sbin/nginx

备份旧版本执行文件
mv /usr/sbin/nginx /usr/sbin/nginx-1.24
![]()
应用新的执行文件
cp nginx-1.25.0/objs/nginx /usr/sbin/

为了避免版本兼容性相关的问题,删除默认开启的功能模块(可以提前保存一份文件到其他目录,防止后面的其他功能使用)
rm -rf /etc/nginx/modules-enabled/*
nginx 检测,配置文件可用,版本己更新

7.2.4 生成新的master进程
虽然 nginx 执行文件已经升级,但是目前承载的 web 服务依然是旧的版本
向当前 nginx(旧版本)的 master 进程发起信号,-USR2 生成新版本 nginx 的 master 进程
kill -USR2 35971

查看效果

查看新旧版本 master 进程的 pid

虽然 nginx 执行文件已经升级,生成了新的 nginx master worker 进程,但是目前承载的 web 服务依然是旧的版本

7.2.5 开始平滑升级
为了演示效果,先通过 wget 让旧服务存活,限速下载

对 旧master 进程进行信号传递,关闭旧worker进程

wget依旧处于工作状态,未中断

主动关闭wget请求或者等待下载请求结束后,再次查看 nginx 的进程状态,旧版本 nginx 的所有 worker 进程都消失了
因为master角色已经切换了,所以目前是新的master进程响应服务了

7.2.6 确定版本升级
再持续观察一段时间后,如果业务没有问题,则可以继续发送信号,退出旧的 master 进程,至此升级完成

8 模块扩展
8.1 相关概念
8.1.1 简介
对于Nginx 来说,我们安装的时候,主要使用的是通用功能,而对于一些特定的功能来说,它是没有的,需要我们借助于第三方模块去搞定。第三方模块是对 Nginx 的功能扩展,需要在编译的时候用 --addmodule=PATH 指定路径,所以在使用前要先获得第三方模块的源码,当然,我们也可以自行编写第三方模块相同的功能,如果 Nginx 有官方模块实现,则尽量使用官方模块实现,如果官方没有该功能,我们才考虑使用第三方模块,一般可以去 github 上搜索我们需要扩展模块。
8.1.2 常见的第三方模块
-
ngx_http_upstream_hash_module:实现基于哈希的负载均衡,可以根据请求的某些特征(如URL、请求头等)来计算哈希值,并将请求分发到相应的后端服务器。这有助于实现更智能、更均衡的负载均衡策略。
-
echo-nginx-module:在Nginx中输出一些信息,可以用来实现简单接口或排错。通过配置该模块,可以在Nginx中直接打印变量值、处理结果等信息,方便开发者进行调试和测试。
-
WebDAV支持模块:为Nginx添加WebDAV(基于HTTP的远程文件访问协议)支持,使得用户可以通过HTTP协议对服务器上的文件进行上传、下载、删除等操作。
-
Lua脚本集成模块:允许在Nginx中集成Lua脚本,实现更复杂的请求处理和响应生成逻辑。通过Lua脚本,可以灵活地处理请求参数、访问后端服务、生成响应内容等。
8.2 操作步骤
8.2.1 准备nginx源码
wget http://nginx.org/download/nginx-1.25.0.tar.gz
tar -zxvf nginx-1.25.0.tar.gz

8.2.2 下载模块-echo
下载模块并解压到指定位置
wget https://github.com/openresty/echo-nginx-module/archive/refs/tags/v0.63.tar.gz
tar -zxvf echo-nginx-module-0.63.tar.gz -C /usr/local/

8.2.3 编译安装
定制配置增加echo模块的功能属性 --add-module=/usr/local/echo-nginx-module-0.63
./configure --with-cc-opt='-g -O2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx-WLuzPu/nginx-1.25.0=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix-map=/build/nginx-WLuzPu/nginx-1.25.0=/usr/src/nginx-1.25.0-2ubuntu7.5 -fPIC -Wdate-time -D_FORTIFY_SOURCE=3' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=stderr --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-mail_ssl_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with-http_perl_module=dynamic --with-http_xslt_module=dynamic --with-mail=dynamic --with-stream=dynamic --with-stream_geoip_module=dynamic --add-module=/usr/local/echo-nginx-module-0.63

编译文件

备份旧的执行文件,替换新的执行文件,并查看效果
![]()

8.2.4 功能使用
定制配置文件
server {
listen 80;
location /echo{
echo "request_uri: $request_uri";
}
}
删除默认配置并重启服务
rm -rf /etc/nginx/sites-enabled/default
systemctl restart nginx

检测效果
curl 10.0.0.114/echo

新增模块成功
2万+

被折叠的 条评论
为什么被折叠?



