nginx 实战指南:从入门到应用精通
1.什么是nginx
Nginx以其出色的性能、高度可扩展性、稳定性和低系统资源消耗而闻名。它常被用于搭建高流量网站、服务静态内容、反向代理和负载均衡,如网站、应用程序服务器、API服务器等。Nginx的特点包括:
- 高性能: Nginx采用了异步事件驱动的架构,可以有效地处理大量并发连接而不消耗太多系统资源。
- 低消耗: Nginx的内存和CPU使用率相对较低,可以在资源有限的环境下高效运行。
- 可扩展性: Nginx可以轻松地扩展以处理更多的并发连接和流量。
- 模块化: Nginx采用模块化的设计,可以通过加载不同的模块来扩展其功能,如HTTP服务器模块、反向代理模块、负载均衡模块等。
- 高可靠性: Nginx经过了广泛的实际测试和应用,被认为是非常稳定可靠的服务器软件之一。
如果你是一个初学者,以上是不是感觉云里雾里的?
那么换成通俗的语言解释一下:
比如现在有三个人,他们各自有各自的能力,分别是,A:做作业;B:做苹果汁;C:出售水果;
有一个中间商D,他会把ABC的能力集中在一起,向其余人展示,向他人提供这些服务;
那么对于其他人需要这些个服务时,就从中间商D获取,由D将ABC的服务能力提供出去。
对于ABC来说,他们都出在不同的地方,不同的工作环境。
而中间商D可以联系到他们,他在这里就承担了一个代理的作用,也就是所谓的nginx。
那么继续深入抽象!
nginx是作为一个web服务的代理服务器,ABC就可以抽象成web服务对应的不同功能;
A:专门做摄像头的转码服务;
B:专门做视频通话的后台服务;
C:专门做web应用后台接口的转发(代理);
那么在开发一个web应用时,需要用到上面的不同的服务,在nginx的代理下,三个服务被代理在不同的端口下进行访问。
而nginx可以是任何一个网站、任何一个APP的总代理,ABC服务在不同的服务器上,不管你如何访问,也不会直接访问到实际运行的服务器上。
对于一个访问该网站的用户来说,他用的是这个网站的功能,而这些功能来源可能来源于不同的服务器上;
对于服务端来说,在一定程度上保证了自身的安全,将不同的服务功能负载均衡在各个服务器,降低单个服务器的压力;
反向代理:在服务端进行服务代理,可以保证内网下的服务安全,仅仅向外暴露一个或几个可以被直接访问的接口,起到一个负载均衡、安全防护等作用。
至此,你大概可以理解了一部分nginx。
2.nginx的使用展示
俗话说,学习一定要明确目的。
所以刚刚认识到了nginx,那么接下来再了解一下它的基本应用场景!
2.1简易的文件服务器
2.1.1效果展示
nginx可以直接代理服务器上某一个目录,在没有任何服务的支持下,可以直接用于web浏览器的展示,类似于一个可以直接访问的文件服务器。
以上是服务器中的文件列表。
这是用nginx代理静态文件的结果。
直接访问某一个静态图片。
2.1.2配置文件
conf
server {
listen 81; # 监听端口81
server_name localhost; # 服务器名称,可以是域名或IP地址
#配置跨域
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Headers *;
add_header Access-Control-Allow-Methods *;
location /img {
# 别名指向图片目录
alias /usr/share/nginx/html/img;
# 开启自动索引,允许列出目录中的文件列表
autoindex on;
#关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_exact_size off;
#开启以服务器本地时区显示文件修改日期!
autoindex_localtime on;
}
}
2.2代理web前端项目
如题所示,nginx应用最醒目的一定是肉眼可以直接看到的,正所谓人们只相信自己的眼睛。
它也是web应用中比较重要的应用的一环。
2.2.1效果展示
这里用一个简单的前端作为演示。
以下为前端代码
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我是web前端一号</title>
</head>
<body>
<h1>
我是web前端一号
</h1>
</body>
</html>
代理结果如下:
2.2.2配置文件
conf
server {
listen 82; # 监听端口82
server_name localhost; # 服务器名称,可以是域名或IP地址
location / {
root /usr/share/nginx/html/web; # 指定根目录
index index.html index.htm; # 指定索引文件
expires 1d; # 设置静态资源的缓存时间为1天
}
error_page 500 502 503 504 /50x.html; # 设置错误页面
location = /50x.html {
root html; # 指定错误页面的根目录
}
}
2.3代理接口服务
当需要使用第三方接口服务时,可以把其中一个端口作为该服务的一个中转转发。
如果是微服务接口,那么可以代理不同服务器的服务,但是对于外部调用者来说,他只会认为这个服务的来源是你的网站。
这样做,一方面可以隐藏后端服务器的真实ip,提供安全性,并且可以做负载均衡,分发流量到多个服务器上,提高性能和可用性。
2.3.1效果展示
这里用简易的文件服务器当做一个简单的接口,作为演示。
2.3.2配置文件
conf
server {
listen 83; # 监听端口83,并启用SSL加密
server_name localhost; # 服务器名称,可以是域名或IP地址
# 当请求路径以/back/开头时,执行以下代理转发操作
location /back/ {
proxy_pass http://123.249.44.112:81/img/; # 将请求代理到指定的目标服务器上
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求,支持持久连接
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部,与下一行配合可以使当前端口可以支持WebSocket协议
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
2.4负载均衡器
Nginx 可以作为负载均衡器,将客户端请求分发到多个后端服务器上,以实现负载均衡和高可用性。通过配置不同的负载均衡算法(如轮询、IP hash、最少连接等),可以根据实际情况灵活地分配请求。
在这里我们只需要知道,可以通过分配服务器各自的能力,分配权重,由nginx来分配客户端不同的请求。
主打一个灵活!
2.4.1效果展示
这里用代理的web前端项目多复制两份作为演示。
2.4.2配置文件
conf
#4.复制后端项目一份,给负载均衡做前提配置,如何负载均衡访问的这台服务器,就是1.png
server {
listen 84; # 监听端口84
server_name localhost; # 服务器名称,可以是域名或IP地址
# 当请求路径以/开头时,执行以下代理转发操作
location / {
proxy_pass http://123.249.44.112:81/img/1.png; # 将请求代理到指定的目标服务器上
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求,支持持久连接
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部,与下一行配合可以使当前端口可以支持WebSocket协议
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
#5.复制后端项目一份,给负载均衡做前提配置,如何负载均衡访问的这台服务器,就是2.jpg
server {
listen 85; # 监听端口85
server_name localhost; # 服务器名称,可以是域名或IP地址
# 当请求路径以/开头时,执行以下代理转发操作
location / {
proxy_pass http://123.249.44.112:81/img/2.jpg; # 将请求代理到指定的目标服务器上
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求,支持持久连接
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部,与下一行配合可以使当前端口可以支持WebSocket协议
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
#6.负载均衡演示,负载均衡两个端口,模拟了两个后台服务
upstream backend {
server 123.249.44.112:84;
server 123.249.44.112:85;
}
server {
listen 86; # 监听端口86
server_name localhost; # 服务器名称,可以是域名或IP地址
location / {
# 当请求路径以/back/开头时,执行以下代理转发操作
proxy_pass http://backend; # 将请求代理到定义的后端服务器组
add_header X-Slave $upstream_addr;#可以在浏览器中显示访问的具体服务器IP
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
2.5开启Https/Wss加密通信
一般正式上线的网站都需要开启https协议,加密通信,提供安全性。
2.5.1服务器证书ssl认证
2.5.1.1创建宿主机ssl目录
bash
//在目录/home/ssl/下创建证书
mkdir /home/ssl/
cd /home/ssl/
chmod 777 ./*
2.5.1.2在该目录下生成证书
sh
openssl genpkey -algorithm RSA -out private.key
openssl req -new -key private.key -out certificate.csr
//nginx需要配置crt
openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt
//pem文件格式
openssl x509 -inform PEM -in certificate.crt > certificate.pem
//验证证书是否正常
openssl x509 -in certificate.pem -noout -text
2.5.2效果展示
这里本地生成一个ssl证书用作演示。
同一个server下代理前端并开启https
同一个server下代理后端并开启https
2.5.3配置文件
conf
server {
listen 88 ssl; # 监听端口88,并启用SSL加密
server_name localhost; # 服务器名称,可以是域名或IP地址
ssl_certificate /ssl/certificate.crt; # SSL证书文件路径
ssl_certificate_key /ssl/private.key; # SSL证书私钥文件路径
ssl_session_timeout 30m; # SSL会话超时时间
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # SSL加密算法
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 支持的SSL协议版本
ssl_prefer_server_ciphers on; # 优先使用服务器端定义的SSL加密算法
# 模拟代理前端项目
location / {
root /usr/share/nginx/html/web; # 指定根目录
index index.html index.htm; # 指定索引文件
}
error_page 500 502 503 504 /50x.html; # 设置错误页面
location = /50x.html {
root html; # 指定错误页面的根目录
}
# 模拟代理后台接口
location /back/ {
# 当请求路径以/back/开头时,执行以下代理转发操作
proxy_pass http://123.249.44.112:86/; # 将请求代理到指定的目标服务器上
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
2.6代理webSocket
web开发中,会携带着实时通信的应用,如聊天室、在线游戏等,我们可以通过nginx反向代理webSocket协议来完成这些功能。
这里就简单一些,把搭建好的webSocket直接代理成wss的协议用做展示。
搭建一个emqx的云环境,用作演示。
2.6.1docker搭建emqx
1.运行以下命令获取 Docker 镜像:
bash
docker pull emqx/emqx:5.5.0
2.运行以下命令启动 Docker 容器。
bash
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 -v /home/emqx/data:/opt/emqx/data -v /home/emqx/log:/opt/emqx/log emqx/emqx:5.5.0
2.6.2效果展示
ruby
访问网址
http://123.249.44.112:18083/#/login?to=/websocket
默认账号密码:admin/mollie123(这里的我已经改了密码,默认是public)
进入问题分析-WebSocket客户端
这个是搭建好没有加密的默认mqtt的一个连接
经过代理后,修改端口为89,修改TLS为true,再次点击连接(如果连接失败,需要在浏览器新标签页中输入https://ip:89,给权限使其通过)
2.6.3配置文件
conf
server {
listen 88 ssl; # 监听端口88,并启用SSL加密
server_name localhost; # 服务器名称,可以是域名或IP地址
ssl_certificate /ssl/certificate.crt; # SSL证书文件路径
ssl_certificate_key /ssl/private.key; # SSL证书私钥文件路径
ssl_session_timeout 30m; # SSL会话超时时间
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # SSL加密算法
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 支持的SSL协议版本
ssl_prefer_server_ciphers on; # 优先使用服务器端定义的SSL加密算法
# 模拟代理前端项目
location / {
root /usr/share/nginx/html/web; # 指定根目录
index index.html index.htm; # 指定索引文件
}
error_page 500 502 503 504 /50x.html; # 设置错误页面
location = /50x.html {
root html; # 指定错误页面的根目录
}
# 模拟代理后台接口
location /back/ {
# 当请求路径以/back/开头时,执行以下代理转发操作
proxy_pass http://123.249.44.112:86/; # 将请求代理到指定的目标服务器上
proxy_http_version 1.1; # 使用HTTP/1.1版本进行代理请求
proxy_set_header Upgrade $http_upgrade; # 设置Upgrade头部
proxy_set_header Connection "upgrade"; # 设置Connection头部
}
}
3.安装和基本配置
安装nginx的形式有很多种,取决于操作系统。
这里将介绍教常用的两种。window安装,linux安装(docker)
3.1window安装
- 进入nginx官网下载nginx.org/en/download...
2.解压查看
3.以管理员身份打开CMD命令行,切换nginx下的目录
vbnet
启动命令:
E:\software\nginx-1.25.4> start nginx
停止(优雅地关闭)命令:
E:\software\nginx-1.25.4> nginx -r quit
停止(快速关闭)命令:
E:\software\nginx-1.25.4> nginx -r stop
注:stop 是快速停止 nginx,可能并不保存相关信息;quit 是完整有序的停止 nginx,并保存相关信息。
重新加载配置文件命令:
E:\software\nginx-1.25.4> nginx -r reload
4.如果启动成功,那么打开浏览输入自己的ip(或localhost)即可访问nginx。localhost:80
5.之后可以修改nginx.conf文件即可完成为nginx的配置。
3.2linux安装(docker)
1.这里在服务器上用docker安装nginx
sh
#下载nginx依赖
docker pull nginx
2.下载好镜像后,使用docker命令启动镜像容器
sh
#挂载80-100端口,挂载一个前端文件目录,挂载一个ssl证书文件目录,挂载nginx.conf配置文件,挂载nginx日志文件
docker run -d -p 80-100:80-100 -p 443:443 --name nginx -v /home/nginx/www:/usr/share/nginx/html -v /home/ssl:/ssl -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx nginx
3.启动完成后,查看启动是否完成
docker ps
4.挂载目录说明
目录 | 说明 |
---|---|
/home/nginx/www | 该位置为物理机挂载前端项目位置 |
/home/ssl | 该位置为物理机挂载SSL证书位置 |
/home/nginx/conf/nginx.conf | 该位置为物理机挂载配置文件位置 |
/home/nginx/logs | 该位置为物理机挂载日志文件位置 |
5.进行修改nginx配置,只需要反复调整nginx.conf文件,之后重启nginx即可
重启命令
docker restart nginx
日志命令
docker logs nginx
4.日常维护
- 定期备份配置文件和日志文件: 确保定期备份Nginx的配置文件和日志文件,以防止意外丢失或损坏。
- 优化配置文件: 定期审查和优化Nginx的配置文件,删除不必要的配置项,优化性能和资源利用率。
- 监控和处理日志: 定期监控Nginx的访问日志和错误日志,及时发现并解决异常情况和错误。
- 实施安全策略: 配置安全策略,限制对Nginx的访问和操作,防止未经授权的访问和恶意攻击。
- 优化性能: 根据实际情况调整Nginx的配置,优化性能和吞吐量,提高网站的响应速度和稳定性。
- 监控网络流量和连接数: 定期监控Nginx的网络流量和连接数,确保服务器资源不被过度使用,并且能够满足用户的需求。
- 实施负载均衡和缓存: 如果有多个后端服务器或需要提高性能,可以配置Nginx作为负载均衡器,并设置缓存,减轻后端服务器的负载。
- 持续学习和更新知识: 持续学习Nginx的最佳实践和新技术,保持对Nginx的了解和掌握,以便及时应对变化和挑战。