运维云计算SRE-第7周
nginx安装和平滑升级,nginx反向代理和HTTPS加密
1. 完成nginx编译安装脚本
在ubuntu系统上编译安装nginx 1.24.0
#1、安装nginx软件依赖包和下载nginx安装包
apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev #安装nginx依赖包
cd /usr/local/src/ #切换指定目录
wget http://nginx.org/download/nginx-1.24.0.tar.gz #下载nginx安装包
wget https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz #下载openssl安装包
tar -xf nginx-1.24.0.tar.gz #nginx安装包解压缩
tar -xf openssl-3.4.0.tar.gz #openssl安装包解压缩
git clone https://github.com/vozlt/nginx-module-vts.git #下载模块nginx-module-vts
git clone https://github.com/openresty/echo-nginx-module.git #下载模块echo-nginx-module
#2、编译安装常用模块,升级openssl模块,并添加第三方模块echo-nginx-module和echo-nginx-module。
cd nginx-1.24.0 #切换指定目录
mkdir -p /apps/nginx #建立安装目录
./configure --prefix=/apps/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 \
--with-openssl=/usr/local/src/openssl-3.4.0 \
--add-module=/usr/local/src/echo-nginx-module \
--add-module=/usr/local/src/nginx-module-vts #编译检查
make && make install #编译并安装
#3、编写service文件,利用systemd管理应用
useradd -r -s /sbin/nologin nginx #添加nginx
cat < /lib/systemd/system/nginx.service << EOF
[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=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOF
sed -i 's/logs\/nginx.pid/\/apps\/nginx\/run\/nginx.pid/' /apps/nginx/conf/nginx.conf #修改nginx 配置文件
ln -s /apps/nginx/sbin/nginx /usr/local/sbin #给nginx启动文件添加软链接
chown -R nginx.nginx /apps/nginx #改变/apps/nginx文件下的文件的属主和属组
systemctl daemon-reload #重新加载systemd配置文件
systemctl enable --now nginx #设置nginx开机启动
#4、验证安装
systemctl status nginx #查看nginx服务启动状态
/apps/nginx/sbin/nginx -V #查看nginx安装信息
验证安装结果

2. 完成nginx平滑升级,总结步骤

#ubuntu系统上nginx-1.24.0平滑升级为nginx-1.26.0
#1、下载新安装包
cd /usr/local/src/ #切换当前目录
wget http://nginx.org/download/nginx-1.26.0.tar.gz #下载新文件
tar -xf nginx-1.26.0.tar.gz #解压安装包
cd nginx-1.26.0 #切换当前目录
#2、平滑安装软件
./configure --prefix=/apps/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 #编译文件
cp /apps/nginx/sbin/nginx /opt/ #保存旧的二进制文件
cp -f objs/nginx /apps/nginx/sbin/nginx #覆盖旧的二进制文件
kill -USR2 `cat /apps/nginx/run/nginx.pid` #发送USR2信号,新进程作为旧进程的子进程
kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin` #发送WINCH信号,关闭旧进程的子进程
kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin` #发送QUIT信号,关闭旧进程的主进程
平滑升级过程中nginx进程变化

完成Nginx平滑升级,总结步骤如下:
一、准备工作
查看当前Nginx版本:
使用nginx -v命令查看当前Nginx的版本信息。
下载并编译新版本Nginx:
从Nginx官网下载新版本的源码包。
解压源码包,并使用与旧版本相同的编译参数进行编译(使用./configure命令配置编译选项,然后执行make命令编译,不执行make install)。
备份旧版本Nginx:
备份旧版本的Nginx二进制文件(通常位于sbin目录下)。
备份Nginx的配置文件(通常位于conf目录下)。
备份PID文件(通常位于/run或自定义的PID文件路径)。
二、升级步骤
替换二进制文件:
将新编译的Nginx二进制文件复制到旧版本的安装目录中的sbin目录下,替换旧的可执行文件。
发送USR2信号:
向旧版本的Nginx主进程发送USR2信号,命令为kill -USR2 <旧主进程PID>。
Nginx会启动一个新的主进程和一组新的工作进程来处理新的连接请求。
此时,旧的主进程和工作进程将继续处理现有的连接。
验证新版本Nginx:
通过访问Nginx服务验证新版本是否正常运行。
检查系统进程列表,确认有两个Nginx主进程在运行(旧的和新的)。
发送WINCH信号:
向旧版本的主进程发送WINCH信号,命令为kill -WINCH <旧主进程PID>。
旧版本的主进程会优雅地关闭其所有工作进程,但不会关闭自己。
此时,所有新的连接请求将由新版本的工作进程处理。
等待旧工作进程退出:
旧工作进程会在处理完当前连接后退出。
可以通过检查进程列表或Nginx的日志文件来确认旧工作进程是否已经全部退出。
发送QUIT信号:
在确认旧版本的工作进程已经全部退出,并且新版本已经接管了所有连接后,向旧版本的主进程发送QUIT信号,命令为kill -QUIT <旧主进程PID>。
旧版本的主进程会优雅地关闭自己,并释放所有资源。
三、清理工作
删除旧版本文件:
删除旧版本的Nginx二进制文件、配置文件和PID文件的备份(如果不再需要)。
验证升级结果:
再次检查Nginx的版本号,确保它显示的是新版本号。
检查Nginx的日志文件,确保没有错误或警告信息。
四、注意事项
在执行平滑升级之前,务必备份所有重要的配置文件和数据。
在测试环境中进行充分的测试,以确保升级过程的安全性和可靠性。
如果在升级过程中遇到任何问题,可以回滚到旧版本,并检查错误日志以诊断问题
3. 总结nginx核心配置,并实现nginx多虚拟主机
Nginx是一款高性能、轻量级的Web服务软件,其核心配置对于Nginx的性能和稳定性至关重要。以下是对Nginx核心配置的总结:
一、配置文件结构
Nginx的配置文件(nginx.conf)通常包含以下几个主要部分:
全局块:主要设置Nginx的启动用户/组、启动的工作进程数量、工作模式、Nginx的PID路径、日志路径等。
events块:主要影响Nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接、使用哪种事件驱动模型、处理请求、每个工作进程可以同时支持的最大连接数、是否开启对多工作进程下的网络连接进行序列化等。
http块:是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这里设置。http块可以包含多个server块,而一个server块中又可以包含多个location块。
server块:可以配置文件引入、MIME-Type定义、日志自定义、是否启用单个链接的请求上限等。
location块:主要基于Nginx接收到的请求字符串对用户请求的URL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能。此外,很多第三方模块的配置也是在location模块中配置。
另外,mail协议相关配置段和stream服务器相关配置段也是Nginx配置的一部分,但默认nginx.conf配置文件不包括这两个块。
二、核心配置指令
user:指定运行worker进程的用户和组。
worker_processes:设置Nginx要开启的工作进程数。通常建议设置为机器的CPU核心数或核心数减1,也可以设置为auto让Nginx自动检测。
worker_cpu_affinity:将Nginx工作进程绑定到指定的CPU核心上,可以提高Nginx服务器的性能。
worker_connections:设置每个worker进程支持的最大连接数。Nginx服务器的最大连接数等于worker_processes乘以worker_connections。
worker_rlimit_nofile:设置每个worker进程能够打开的最大文件句柄数,此值应足够大以支持预期的并发连接数。
use:指定Nginx使用的事件驱动模型,Linux系统推荐使用epoll。
multi_accept:设置是否允许一次性地响应多个用户请求。
include:引入其他配置文件,提高配置的可维护性。
sendfile:指定Nginx是否调用sendfile函数(zerocopy方式)来输出文件,对于普通应用必须设为on。
keepalive_timeout:设置长连接的超时时间。
log_format:定义日志格式。
access_log:设置访问日志文件的路径和格式。
error_log:设置错误日志文件的路径和级别。
server_name:定义虚拟主机的名称,Nginx根据server_name来区分不同的虚拟主机。
listen:指定Nginx监听的端口,Nginx默认监听80端口。
root:指定请求的根目录。
index:设置默认访问的页面文件。
location:基于请求的URL进行匹配,并对特定的指令进行处理。
proxy_pass:将请求转发到后端服务器,常用于反向代理和负载均衡场景。
gzip:开启或关闭gzip压缩功能,开启gzip可以减小传输数据量,提高网页加载速度。
三、配置示例
以下是一个简单的Nginx配置示例:
# 设置Nginx工作进程的数量为自动,通常等于系统的CPU核心数
worker_processes auto;
events {
# 每个工作进程支持的最大连接数
worker_connections 1024;
# 使用epoll事件模型(Linux系统推荐)
use epoll;
# 允许一次性接受多个网络连接
multi_accept on;
}
http {
# 包含MIME类型映射文件
include mime.types;
# 默认MIME类型
default_type application/octet-stream;
# 定义日志格式
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;
# 是否调用sendfile函数来输出文件
sendfile on;
# 长连接的超时时间
keepalive_timeout 65;
# 第一个server块配置
server {
# 监听80端口
listen 80;
# 服务器名称
server_name localhost;
# 根目录配置
location / {
root /usr/share/nginx/html;
# 默认访问的页面文件
index index.html index.htm;
}
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 反向代理配置示例
location /app {
# 将请求转发到后端服务器
proxy_pass http://127.0.0.1:8080;
# 设置请求头中的Host字段
proxy_set_header Host $host;
# 设置请求头中的X-Real-IP字段为客户端的真实IP
proxy_set_header X-Real-IP $remote_addr;
# 设置请求头中的X-Forwarded-For字段,记录客户端的IP和经过的代理服务器IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 注意:以下部分应该是一个独立的server块配置,不应该嵌套在上面的server块内
# 修正后的负载均衡配置示例
server {
listen 80;
server_name myapp.example.com;
location / {
# 将请求转发到上游服务器组myapp1
proxy_pass http://myapp1;
}
# 定义上游服务器组
upstream myapp1 {
# 后端服务器1,并设置权重为5
server backend1.example.com weight=5;
# 后端服务器2
server backend2.example.com;
}
}
}
这个配置示例包括了全局块、events块和http块的基本配置,以及一个简单的server块和location块的配置。其中还包含了反向代理和负载均衡的配置示例。
综上所述,Nginx的核心配置涉及多个方面,包括全局设置、事件处理、HTTP服务配置等。合理配置这些参数可以优化Nginx的性能和稳定性,满足不同的应用需求。
在ubuntu系统(IP:10.0.0.10)实现多虚拟机
1、编辑nignx主配置文件
mkdir /apps/nginx/conf/conf.d/ #建立配置文件夹
vim /apps/nginx/conf/nginx.conf
server{
....
include /apps/nginx/conf/conf.d/*.conf; #添加配置文件
}
2、建立pc端和移动端网站资源文件
mkdir -pv /apps/nginx/html/{pc,mobile} #建立资源文件夹
echo "welcome to www.wenlarion.com!" > /apps/nginx/html/pc/index.html #建立pc端主页
echo "welcome to www.wenlarion.com!" > /apps/nginx/html/pc/index.html #建立p移动端主页
3、编辑pc端和移动端的网站配置文件
vim /apps/nginx/conf/conf.d/www.wenlarion.com.conf #编辑pc端网站配置文件
server {
server_name www.wenlarion.com; #pc端网站名
root /apps/nginx/html/pc; #pc端网站资源地址
}
vim /apps/nginx/conf/conf.d/m.wenlarion.com.conf #编辑移动端网站配置文件
server {
server_name m.wenlarion.com; #移动端网站名
root /apps/nginx/html/mobile; #移动端网站资源地址
}
nginx -t #检查nignx配置文件语法错误
nignx -s reload #重新加载nignx配置文件
4、在rocky系统的主机(IP:10.0.0.8)测试pc端和移动端网站结果
curl www.wenlarion.com #测试pc端网站
curl m.wenlarion.com #测试移动端网站

4. 总结nginx日志格式定制
Nginx日志格式的定制对于服务器管理和数据分析至关重要。以下是对Nginx日志格式定制的总结,包括JSON格式的配置:
一、Nginx日志格式概述
Nginx的日志格式主要通过log_format指令进行定义,该指令允许用户指定日志条目的格式和内容。Nginx支持多种日志格式,包括默认的文本格式和自定义的JSON格式等。
二、常用日志变量
在定义日志格式时,可以使用Nginx内置的变量来记录日志条目的详细信息。以下是一些常用的变量:
$remote_addr:客户端IP地址。
$remote_user:客户端用户标识(如果通过身份验证)。
$time_local:本地时间,表示服务器处理请求的时间。
$time_iso8601:ISO 8601格式的时间。
$request:请求行,包括请求方法、URL和HTTP协议版本。
$status:HTTP状态码,表示请求处理的结果。
$body_bytes_sent:发送给客户端的响应体大小(不包括响应头)。
$http_referer:引用来源URL,表示客户端是从哪个页面链接过来的。
$http_user_agent:客户端用户代理,包括浏览器类型和版本等信息。
$http_x_forwarded_for:如果使用代理,则为客户端的真实IP地址。
$upstream_addr:处理请求的上游服务器的地址。
$upstream_response_time:上游服务器响应的时间。
$request_time:处理请求所用的时间。
三、自定义日志格式
文本格式
文本格式是Nginx默认的日志格式,可以通过log_format指令进行自定义。例如:
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
JSON格式
JSON格式的日志对于后续的数据分析和处理更为方便。以下是一个JSON格式日志的示例配置:
log_format json '{"@timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": $status, '
'"body_bytes_sent": $body_bytes_sent, '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"upstream_addr": "$upstream_addr", '
'"upstream_response_time": "$upstream_response_time", '
'"request_time": $request_time}';
四、应用自定义日志格式
定义好日志格式后,需要使用access_log指令将其应用到访问日志中。例如:
access_log /var/log/nginx/access.json json;
这条指令将使用名为json的日志格式记录访问日志到/var/log/nginx/access.json文件中。注意,这里的文件后缀为.json,但Nginx并不会自动将日志内容格式化为JSON文件,而是将日志条目以JSON字符串的形式写入文件。因此,在后续处理日志时,需要将其解析为JSON格式。
五、注意事项
日志级别:在配置错误日志时,可以使用error_log指令并指定日志级别(如info、debug、notice、warn、error等)。不同级别记录了不同详细程度的消息。
日志轮转:为了避免日志文件无限增长,可以使用日志轮转工具(如logrotate)来定期轮换、压缩和删除旧日志文件。
安全性:在记录日志时,要注意不要泄露敏感信息(如密码、密钥等)。此外,对于包含用户隐私的日志信息,应采取适当的保护措施(如加密、匿名化等)。
性能影响:使用JSON格式日志可能会对Nginx的性能产生一定影响,因为需要将日志条目序列化为JSON字符串。因此,在配置JSON格式日志时,需要权衡性能和数据可读性之间的平衡。
通过以上步骤,您可以根据实际需求定制Nginx的日志格式,以便更好地跟踪服务器性能和识别问题。同时,使用JSON格式的日志可以更方便地进行后续的数据分析和处理。
5. 总结nginx反向代理及https安全加密
以下是更为详细的关于 Nginx 反向代理及 HTTPS 安全加密的总结
Nginx 反向代理
1. 反向代理基础概念
反向代理是一种服务器架构模式,它充当了客户端和后端真实 Web 服务器之间的中间层。客户端发起请求时,直接与反向代理服务器交互,反向代理服务器根据预先配置的规则,将请求转发到对应的后端 Web 服务器进行处理,最后再把后端服务器返回的响应传递给客户端。从客户端视角来看,它并不知道自己的请求实际上是由后端多个服务器协同处理的,以为只是与单一的目标服务器通信。
2. Nginx 实现反向代理的核心配置元素及示例
server 块配置:
server 块是 Nginx 配置文件中用于定义虚拟服务器的部分,一个 server 块通常对应一个域名或者特定的 IP 及端口组合。
以下是一个基本示例,假设要为域名 example.com 配置反向代理:
server {
listen 80; # 监听80端口,这是HTTP协议默认的端口,用于接收来自客户端的HTTP请求
server_name example.com; # 明确此虚拟服务器对应的域名,即客户端访问该域名的请求会由这个server块来处理
}
location 块配置:
location 块用于匹配客户端请求的 URL 路径,进而决定针对不同路径的请求如何进行处理。可以根据精确匹配、前缀匹配等多种方式来定义规则。
例如,要把以 /blog 为前缀路径的请求转发到特定后端服务器,配置如下:
server {
listen 80;
server_name example.com;
location /blog {
# 这里可以添加更多针对/blog路径请求的相关配置,后续再决定转发的具体操作
}
}
proxy_pass 指令应用及相关设置:
proxy_pass 指令是实现反向代理中请求转发的关键,它指定了后端真实 Web 服务器的地址(可以是 IP 加端口形式,也可以是基于 upstream 定义的服务器集群名称等)。同时,常配合一些 proxy_set_header 等指令来完善转发时的请求头设置,确保后端服务器能正确处理请求。
以下是一个完整的示例,后端有一台服务器 IP 为 192.168.1.100 ,运行 Web 服务端口是 8080 ,我们将域名 example.com 下所有请求都转发到这台后端服务器:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://192.168.1.100:8080; # 将符合此location规则(这里是所有请求,因为是根路径匹配)的请求转发到后端指定IP和端口的服务器
proxy_set_header Host $host; # 把客户端请求中的Host头信息原封不动地传递给后端服务器,这样后端服务器能知晓请求原本指向的域名,便于正确处理,例如在涉及虚拟主机配置的情况下很重要
proxy_set_header X-Real-IP $remote_addr; # 将客户端的真实IP地址传递给后端服务器,方便后端进行日志记录、访问控制等操作,否则后端服务器看到的请求IP可能是Nginx反向代理服务器的IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 用于记录经过多个代理服务器时的客户端IP信息传递情况,方便追踪请求来源,在复杂网络架构中有重要作用
}
}
3. 反向代理的优势及对应实例
隐藏后端服务器信息:
比如一家大型电商平台,背后可能有几十台不同的服务器,分布在不同的数据中心,负责处理商品展示、订单处理、用户登录等不同业务功能。通过 Nginx 反向代理,对外只暴露反向代理服务器的 IP 和域名(如 example.com )。即使电商平台内部对后端服务器进行硬件升级、系统迁移或者增减服务器数量等操作,只要 Nginx 反向代理的配置保持稳定,外部客户端在浏览器访问电商网站时,根本察觉不到后端的这些变化,保障了后端架构的灵活性和安全性。
负载均衡:
以一个热门的新闻资讯网站为例,每天有海量的用户访问。网站运营方在后端部署了多台 Web 服务器来共同分担流量压力。在 Nginx 配置中,可以使用 upstream 指令定义后端服务器集群,如下:
upstream backend_pool {
server 192.168.1.100:8080; # 第一台后端服务器
server 192.168.1.101:8080; # 第二台后端服务器
server 192.168.1.102:8080; # 第三台后端服务器
}
然后在 server 块和 location 块中使用这个 upstream 定义的集群进行反向代理请求转发,像这样:
server {
listen 80;
server_name news.example.com;
location / {
proxy_pass http://backend_pool; # 将请求按照默认的轮询策略(也可配置加权轮询等其他策略)分配到backend_pool定义的各后端服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样,大量的用户请求会均匀地分配到这几台后端服务器上,避免某一台服务器因负载过高而出现响应缓慢甚至崩溃的情况,提高了整个网站的性能和可用性,确保不同用户都能快速获取到新闻资讯。
缓存功能:
假设一个图片分享网站,有很多热门的图片资源被用户频繁访问。Nginx 反向代理可以设置缓存,对这些经常被请求的静态图片资源进行缓存处理。配置示例如下:
server {
listen 80;
server_name images.example.com;
location / {
proxy_cache my_cache; # 定义使用名为my_cache的缓存区
proxy_cache_valid 200 302 60m; # 针对状态码为200和302的响应,缓存有效期设置为60分钟
proxy_cache_valid 404 10m; # 针对状态码为404的响应,缓存有效期设置为10分钟
proxy_pass http://backend_server; # 转发请求到后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
当用户再次请求已经被缓存的图片时,Nginx 反向代理可以直接从缓存中提取并返回相应图片资源,无需每次都向后端服务器请求,大大加快了响应速度,节省了后端服务器资源以及网络带宽。
HTTPS 安全加密
1. HTTPS 基本原理深入解析
HTTPS(Hypertext Transfer Protocol Secure)的核心在于在 HTTP 协议基础上引入了 SSL/TLS 加密层,通过加密技术来保障数据传输的安全性、完整性以及对服务器身份进行验证。
证书环节详细说明:
服务器要先向权威的证书颁发机构(CA)申请 SSL/TLS 证书。证书中包含了服务器的公钥、服务器相关的身份信息(如域名、组织信息等)以及证书颁发机构的数字签名等内容。客户端在与服务器建立连接时,会收到服务器返回的证书,然后会验证证书的合法性,主要检查以下几个方面:
证书是否由受信任的 CA 颁发:客户端会内置一些根证书(来自知名的、被广泛认可的 CA 机构),通过验证服务器证书的颁发机构是否在信任列表中,来初步判断证书的可信度。
证书是否过期:证书都有有效期限制,客户端会查看当前证书是否还在有效期内,如果过期则会提示安全风险,拒绝连接。
证书的域名与请求的域名是否匹配:例如,客户端请求的是 example.com 域名对应的服务器,那么服务器返回的证书中所标识的域名也应该是 example.com ,否则可能存在中间人冒用服务器身份的情况。
加密过程细致剖析:
非对称加密阶段:客户端向服务器发起连接请求,服务器将包含公钥的证书发送给客户端。客户端验证证书通过后,会生成一个随机的对称加密密钥(也叫会话密钥),然后使用服务器的公钥对这个对称加密密钥进行加密,并发送给服务器。由于只有服务器拥有对应的私钥,所以只有服务器能够解密得到这个对称加密密钥。
对称加密阶段:一旦服务器获取到对称加密密钥,后续客户端与服务器之间传输的数据(如网页内容、表单数据等)就都使用这个对称加密密钥进行加密和解密操作。对称加密的效率相对较高,适合大量数据的加密传输,而非对称加密则主要用于在不安全的网络环境下安全地传递对称加密密钥这个关键信息。
2. Nginx 配置 HTTPS 的详细步骤及示例
证书准备与放置:
首先,从权威 CA 机构获取到 SSL/TLS 证书文件(通常是 .crt 格式)以及对应的私钥文件( .key 格式),然后将它们妥善放置在 Nginx 服务器的指定目录下,假设放在 /etc/nginx/ssl 目录。
server 块中的 HTTPS 配置:
以下是一个完整的在 Nginx 中配置 HTTPS,针对域名 example.com 的示例:
server {
listen 443 ssl; # 监听443端口并启用SSL协议,这是HTTPS默认使用的端口,用于接收来自客户端的HTTPS请求
server_name example.com; # 明确此虚拟服务器对应的域名
ssl_certificate /etc/nginx/ssl/example.com.crt; # 指定SSL证书文件的路径,让Nginx知道去哪里获取服务器的证书来提供给客户端验证
ssl_certificate_key /etc/nginx/ssl/example.com.key; # 指定SSL私钥文件的路径,该私钥与证书中的公钥相对应,用于服务器解密客户端发来的加密信息等操作
ssl_protocols TLSv1.2 TLSv1.3; # 明确支持的SSL/TLS协议版本,选择较新且安全性更高的协议版本,旧版本可能存在一些安全漏洞,这里推荐使用TLSv1.2及以上版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256; # 配置加密算法套件,从众多可用的加密算法中选择安全性高、性能相对合适的组合,不同的算法在加密强度、加密速度等方面有所差异
ssl_prefer_server_ciphers on; # 设置优先使用服务器端配置的加密算法,确保按照服务器端设定的安全标准来进行加密通信
ssl_session_timeout 5m; # 设置SSL会话的超时时间,在这个时间段内,如果客户端再次发起连接,可能可以复用之前的SSL会话,减少握手等开销,提高性能
ssl_session_cache shared:SSL:10m; # 定义SSL会话缓存的类型和大小,方便复用SSL会话,节省资源和时间
location / {
proxy_pass http://192.168.1.100:8080; # 若还有反向代理需求,将请求转发到后端服务器(此处示例沿用前面提到的后端服务器配置)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
此外,为了让客户端在访问 http://example.com 时能自动跳转到 https://example.com ,还可以添加如下配置(在另一个监听 80 端口的 server 块中):
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri; # 301重定向,将HTTP请求永久重定向到对应的HTTPS请求,确保用户始终通过安全加密的连接访问网站
}
nginx反向代理和https安全加密综合实例

1、数据存储配置:在server0安装mysql和redis,在server1安装nfs
#server0安装mysql和redis
apt update && apt -y install mysql redis-server #更新软件源并更新软件
#mysql设置
sed -i '/127.0.0.1/s/^/#/' /etc/mysql/mysql.conf.d/mysqld.cnf #修改mysql配置软件
systemctl restart mysql.service #启动mysqld服务
mysql #进入mysql软件
create database wordpress;#创建数据库
create user wordpress@'10.0.0.%' identified by '123456'; #创建用户wordpress
create user admin@'10.0.0.%' identified by '123456'; #创建用户admin
grant all on wordpress.* to wordpress@'10.0.0.%';将wordpress数据库的所有权限给用户wordpress
grant all on *.* to admin @'10.0.0.%'; #将所有数据库的所有权限给用户admin
#server1安装nfs
apt update && apt -y install nfs-server #更新软件源并更新软件
mkdir -p /data/wordpress/wp-content/uploads/ #创建挂载文件夹
vim /etc/exports #挂载设置
/data/wordpress/wp-content/uploads/ 10.0.0.0/24(rw)
exportfs -r #使挂载设置生效
2、网站综合配置:在website0和website1安装nginx和php-fpm,并安装php-mysql、php-redis、nfs-common用于数据接入。此外,还考虑多虚拟机以及数据缓存的设置。
#website0和website1负责负载均衡,做相同配置
#1、下载软件
apt update && apt -y install nginx php-fpm php-mysql php-redis nfs-common#更新软件源并更新软件
#2、下载网站数据
mkdir -p /data/wordpress #建立网站wordpress的数据文件夹
mkdir -p /data/phpmyadmin #建立网站phpmyadmin的数据文件夹
cd /opt/ #切换指定目录
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
#下载虚拟机wordpress
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
#下载虚拟机phpmyadmin数据
tar -xf latest-zh_CN.tar.gz #解压文件到wordpress
upzip phpMyAdmin-5.2.1-all-languages.zip #解压文件到phpMyAdmin-5.2.1-all-languages
cp /opt/wordpress/* /data/wordpress #拷贝wordpress的文件到目标文件
cp /opt/phpMyAdmin-5.2.1-all-languages/* /data/phpmyadmin #拷贝phpmyadmin的文件到目标文件
chown -R www-data. /data/ #改变data下属文件的属主和属组
#3、nignx多虚拟机和缓存设置
# 使用vim编辑器编辑Nginx配置文件
vim /etc/nginx/conf.d/www.wenlarion.com.conf
# 设置FastCGI缓存的路径和配置
fastcgi_cache_path /data/wordpress/fastcgi_cache levels=1:2 keys_zone=cache_zone:10m;
# levels=1:2 表示使用两级目录结构存储缓存文件
# keys_zone=cache_zone:10m 为缓存键分配10MB的内存空间
server {
listen 80; # 监听80端口
server_name www.wenlarion.com; # 设置服务器名称为www.wenlarion.com
root /data/wordpress; # 网站根目录
index index.php index.html; # 默认访问的文件
client_max_body_size 100m; # 允许客户端请求的最大单文件字节数
location ~ \.php$|/php-status|/ping { # 匹配以.php结尾的请求或特定请求
root /data/wordpress; # 重新声明根目录(通常可以省略,因为已在server块中声明)
#fastcgi_pass 127.0.0.1:9000; # 通过TCP/IP连接到PHP-FPM(已被注释掉)
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # 通过Unix Socket连接到PHP-FPM
fastcgi_index index.php; # 默认执行的PHP文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 传递脚本文件路径给PHP-FPM
include fastcgi_params; # 包含FastCGI参数文件
# FastCGI缓存配置
fastcgi_cache cache_zone; # 使用之前定义的缓存区
fastcgi_cache_key $request_uri; # 使用请求的URI作为缓存键
fastcgi_cache_valid 200 302 10m; # 对于状态码200和302的响应,缓存10分钟
fastcgi_cache_valid 404 1m; # 对于状态码404的响应,缓存1分钟
fastcgi_param HTTPS on; # 将HTTPS参数设置为on,这通常用于后端处理HTTPS请求
}
}
# 使用vim编辑器编辑另一个Nginx配置文件
vim /etc/nginx/conf.d/www.phpmyadmin.com.conf
server {
listen 80; # 监听80端口
server_name www.phpmyadmin.com; # 设置服务器名称为www.phpmyadmin.com
root /data/phpmyadmin; # 网站根目录
index index.php index.html; # 默认访问的文件
client_max_body_size 200m; # 允许客户端请求的最大单文件字节数(比前一个配置大)
location ~ \.php$|/php-status|/ping { # 匹配以.php结尾的请求或特定请求
root /data/phpmyadmin; # 重新声明根目录(通常可以省略,因为已在server块中声明)
#fastcgi_pass 127.0.0.1:9000; # 通过TCP/IP连接到PHP-FPM(已被注释掉)
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # 通过Unix Socket连接到PHP-FPM
fastcgi_index index.php; # 默认执行的PHP文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 传递脚本文件路径给PHP-FPM
include fastcgi_params; # 包含FastCGI参数文件
fastcgi_param HTTPS on; # 将HTTPS参数设置为on,这通常用于后端处理HTTPS请求
}
}
nginx -s reload #使nignx配置生效
#4、php设置和挂载设置
vim /etc/php/8.3/fpm/pool.d/www.conf #编辑php配置文件,追加缓存到redis
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://10.0.0.18:6379"
vim /etc/php/8.3/fpm/php.ini #编辑php.ini ,修改上传文件大小设置
post_max_size = 200M
upload_max_filesize = 200M
systemctl restart php8.3-fpm.service #重启php
vim /etc/fstab #修改挂载配置文件,nfs挂载设置
10.0.0.102:/data/wordpress/wp-content/uploads/ /data/wordpress/wp-content/uploads/ nfs _netdev,defaults 0 0
mount -a #挂载文件/data/wordpress/wp-content/uploads/
3、反向代理配置:在proxy安装nginx,配置多反向代理。
#proxy反向代理设置
#1、下载软件
apt update && apt -y install nginx #更新软件源并更新软件
#2、获取www.wenlarion.com和www.phpmyadmin.com的SSL证书
# 使用vim编辑器打开certificate.sh脚本文件
vim certificate.sh
# 定义变量
SITE_NAME=$1 # 网站域名
CA_SUBJECT="/O=wang/CN=ca.magedu.org" # CA证书的主题信息
SUBJECT="/C=CN/ST=henan/L=zhengzhou/O=wang/CN=$SITE_NAME" # 网站证书的主题信息
SERIAL=34 # 证书序列号
EXPIRE=3650 # 证书有效期(天)
FILE=$SITE_NAME # 输出文件名(基于网站域名)
# 生成CA证书和私钥
openssl req -x509 -newkey rsa:2048 -subj "$CA_SUBJECT" -keyout ca.key -nodes -days 202002 -out ca.crt
# 注意:上面的-days 202002可能是一个错误,通常我们使用类似-days 3650这样的值。202002可能意味着到2020年2月的某一天,但这不是一个标准的用法。
# 生成网站证书的私钥和CSR(证书签名请求)
openssl req -newkey rsa:2048 -nodes -keyout "${FILE}.key" -subj "$SUBJECT" -out "${FILE}.csr"
# 使用CA证书签署网站CSR,生成网站证书
openssl x509 -req -in "${FILE}.csr" -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out "${FILE}.crt"
# 设置私钥文件的权限为600,确保只有文件所有者可以读取
chmod 600 "${FILE}.key" ca.key
# 创建存储SSL证书的目录(如果不存在)
mkdir -p /apps/nginx/conf/ssl0
mkdir -p /apps/nginx/conf/ssl1
# 执行上述脚本(此注释应在实际脚本文件外部,作为执行指令的说明)
bash certificate.sh www.wenlarion.com
bash certificate.sh www.phpmyadmin.com
# 将CA证书和网站证书合并为一个PEM文件,通常用于Nginx配置中
cd /apps/nginx/conf/ssl0
cat ca.crt www.wenlarion.com.crt > www.wenlarion.com.pem
cd /apps/nginx/conf/ssl1
cat ca.crt www.phpmyadmin.com.crt > www.phpmyadmin.com.pem
#2、nignx多反向代理
# 使用vim编辑器打开并编辑 www.wenlarion.com 的配置文件
vim www.wenlarion.com.conf
# 定义一个名为wordpress的上游服务器组,用于负载均衡
upstream wordpress {
# 定义第一个后端服务器,IP地址为10.0.0.100,监听80端口
server 10.0.0.100:80;
# 定义第二个后端服务器,IP地址为10.0.0.101,监听80端口
server 10.0.0.101:80;
}
# 配置一个服务器块,用于处理www.wenlarion.com的请求
server {
# 监听80端口,用于HTTP请求
listen 80;
# 指定服务器的域名
server_name www.wenlarion.com;
# 监听443端口,用于HTTPS请求
listen 443 ssl;
# 指定SSL证书的路径
ssl_certificate /apps/nginx/conf/ssl0/www.wenlarion.com.pem;
# 指定SSL证书密钥的路径
ssl_certificate_key /apps/nginx/conf/ssl0/www.wenlarion.com.key;
# 如果请求是通过HTTP发出的,则重定向到HTTPS
if ( $scheme = http ){
return 301 https://$server_name$request_uri;
}
# 配置一个位置块,用于处理所有进入的请求
location /{
# 将请求代理到上游服务器组wordpress
proxy_pass http://wordpress;
# 设置请求头,将原始请求的Host字段传递给后端服务器
proxy_set_header Host $http_host;
}
}
# 使用vim编辑器打开并编辑 www.phpmyadmin.com 的配置文件
vim www.phpmyadmin.com.conf
# 定义一个名为phpmyadmin的上游服务器组,用于负载均衡
upstream phpmyadmin {
# 注释掉的ip_hash指令用于根据客户端IP分配请求到特定的服务器,以实现会话持久性
# ip_hash;
# 定义第一个后端服务器,IP地址为10.0.0.100,监听80端口
server 10.0.0.100:80;
# 定义第二个后端服务器,IP地址为10.0.0.101,监听80端口
server 10.0.0.101:80;
}
# 配置一个服务器块,用于处理www.phpmyadmin.com的请求
server {
# 监听80端口,用于HTTP请求
listen 80;
# 指定服务器的域名
server_name www.phpmyadmin.com;
# 监听443端口,用于HTTPS请求
listen 443 ssl;
# 注意:这里使用的是www.wenlarion.com的SSL证书和密钥,这在实际部署中可能需要调整
ssl_certificate /apps/nginx/conf/ssl1/www.phpmyadmin.com.pem;
ssl_certificate_key /apps/nginx/conf/ssl1/www.phpmyadmin.com.key;
# 如果请求是通过HTTP发出的,则重定向到HTTPS
if ( $scheme = http ){
return 301 https://$server_name$request_uri;
}
# 配置一个位置块,用于处理所有进入的请求
location /{
# 将请求代理到上游服务器组phpmyadmin
proxy_pass http://phpmyadmin;
# 设置请求头,将原始请求的Host字段传递给后端服务器
proxy_set_header Host $http_host;
}
}
nginx -s reload #使nignx配置生效
4、测试结果
在windows系统中修改 C:\Windows\System32\drivers\etc\hosts文件,添加一行
10.0.0.10 www.wenlarion.com www.phpmyadmin.com
之后,依次访问https://www.wenlarion.com和https://www.phpmyadmin.com,安装wordpress和phpmyadmin,对网页进行测试。
https加密和多虚拟机测试结果:


负载均衡测试结果:刷新页面,用户变为admin@10.0.0.100

更多推荐





所有评论(0)