nginx 实战指南:从入门到应用精通

nginx 实战指南:从入门到应用精通

1.什么是nginx

Nginx以其出色的性能、高度可扩展性、稳定性和低系统资源消耗而闻名。它常被用于搭建高流量网站、服务静态内容、反向代理和负载均衡,如网站、应用程序服务器、API服务器等。Nginx的特点包括:

  1. 高性能: Nginx采用了异步事件驱动的架构,可以有效地处理大量并发连接而不消耗太多系统资源。
  2. 低消耗: Nginx的内存和CPU使用率相对较低,可以在资源有限的环境下高效运行。
  3. 可扩展性: Nginx可以轻松地扩展以处理更多的并发连接和流量。
  4. 模块化: Nginx采用模块化的设计,可以通过加载不同的模块来扩展其功能,如HTTP服务器模块、反向代理模块、负载均衡模块等。
  5. 高可靠性: 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安装

  1. 进入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.日常维护

  1. 定期备份配置文件和日志文件: 确保定期备份Nginx的配置文件和日志文件,以防止意外丢失或损坏。
  2. 优化配置文件: 定期审查和优化Nginx的配置文件,删除不必要的配置项,优化性能和资源利用率。
  3. 监控和处理日志: 定期监控Nginx的访问日志和错误日志,及时发现并解决异常情况和错误。
  4. 实施安全策略: 配置安全策略,限制对Nginx的访问和操作,防止未经授权的访问和恶意攻击。
  5. 优化性能: 根据实际情况调整Nginx的配置,优化性能和吞吐量,提高网站的响应速度和稳定性。
  6. 监控网络流量和连接数: 定期监控Nginx的网络流量和连接数,确保服务器资源不被过度使用,并且能够满足用户的需求。
  7. 实施负载均衡和缓存: 如果有多个后端服务器或需要提高性能,可以配置Nginx作为负载均衡器,并设置缓存,减轻后端服务器的负载。
  8. 持续学习和更新知识: 持续学习Nginx的最佳实践和新技术,保持对Nginx的了解和掌握,以便及时应对变化和挑战。
相关推荐
paopaokaka_luck1 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~3 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616883 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
2401_865854887 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
AskHarries7 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端
2401_857622667 小时前
SpringBoot健身房管理:敏捷与自动化
spring boot·后端·自动化