目录
一、引言
在项目发展初期,并发量和用户量较少时,简单地将一个 jar 包部署到服务器 tomcat 上即可满足需求。然而,随着用户数量的不断增长以及并发量的持续增大,单台服务器容易面临性能瓶颈,出现 “红温” 现象。此时,为了提升系统的处理能力和稳定性,需要将应用部署到多台服务器上。但这样一来,多个服务器之间的 session 不共享容易引发各种错误。于是,Nginx 服务器应运而生,它能够有效地管理和转发代理请求到其他多台服务器,实现反向代理和负载均衡,从而解决上述难题,正所谓 “没有什么是加一层解决不了的问题”。
二、Nginx 概述
Nginx 是一款高性能的 HTTP 和反向代理 web 服务器。其显著特点是内存占用少且并发能力极强,据官方测试结果显示,它能够支持高达 50000 个并发连接数的响应,这使得它在处理大量网络请求时表现出色,成为众多企业构建高效网络架构的重要选择。
三、Nginx 的作用
(一)正向代理
- 定义:
- 正向代理处于客户端与目标服务器之间。它的工作流程是先接收客户端发出的请求,然后将该请求转发至目标服务器,最后把目标服务器返回的响应回传给客户端。
- 用途:
- 主要用于保障客户端的隐私与安全。例如,它能够隐藏客户端的真实 IP 地址,使得客户端在访问某些资源时可以避免被追踪。同时,它还可用于访问受限制的资源,比如突破某些地区或网络环境下对特定网站的访问限制,或者实现网络访问加速等功能。此外,在企业内部网络管理中,正向代理还能协助实现访问控制,比如限制员工对特定网站的访问权限,以提高企业网络的安全性和管理效率。
- 示例:
- 借助 Python 的 requests 库可以便捷地实现正向代理功能。只需在代码中通过设置 proxies 参数,指定代理服务器的地址和端口,就能够让客户端的请求通过代理服务器进行转发。例如:
import requests
proxies = {
"http": "http://proxy_ip:proxy_port",
"https": "https://proxy_ip:proxy_port"
}
response = requests.get("http://target_url", proxies=proxies)
(二)反向代理
- 定义:
- 反向代理位于目标服务器与客户端之间。它接收来自客户端的请求,然后依据特定的规则将请求转发到一个或多个目标服务器上,并把目标服务器返回的响应传递回客户端。
- 用途:
- 反向代理在多个方面发挥着重要作用。首先是负载均衡,它能够将大量的客户端请求合理地分配到多个目标服务器上,避免单个服务器因负载过重而出现性能下降甚至宕机的情况,从而提高整个系统的性能和可用性。其次,在安全防护方面,它可以充当安全屏障,隐藏实际的服务器 IP 地址,对外只暴露反向代理服务器的地址,有效减少服务器遭受直接攻击的风险。此外,它还能进行 SSL 终止操作,减轻后端服务器的 SSL 加密解密负担,提高处理效率。并且,反向代理还可集成 Web 应用防火墙(WAF)等安全防护措施,进一步增强系统的安全性。
- 示例:
- 通过配置 Nginx 可以轻松实现反向代理功能。例如,使用 upstream 配置块来管理多个目标服务器。在 Nginx 配置文件中可以这样设置:
upstream backend_cluster {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com down;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
(三)负载均衡策略
- 内置策略:
- 轮询:按照顺序依次将客户端请求分配到各个目标服务器上,每个服务器被轮流选中的机会均等。例如,假设有三台服务器 A、B、C,第一个请求分配到 A,第二个请求分配到 B,第三个请求分配到 C,然后再循环回到 A,如此轮流执行。
- 加权轮询:根据每个目标服务器的性能差异等因素为其分配不同的权重。性能较强的服务器可以被分配较高的权重,这样它就会有更多的机会被选中处理请求。比如服务器 A 的权重设置为 3,服务器 B 的权重设置为 2,服务器 C 的权重设置为 1,那么在 6 个请求中,服务器 A 可能会被选中 3 次,服务器 B 被选中 2 次,服务器 C 被选中 1 次。
- Iphash:对客户端请求的 IP 地址进行 hash 运算,然后依据 hash 运算的结果将同一个客户端的 IP 请求始终分发给同一台服务器进行处理。这种方式可以在一定程度上解决 session 不共享的问题,但由于其局限性(如服务器故障时可能导致部分用户无法访问),通常在实际应用中不建议仅依靠 Nginx 的 Iphash 来实现 session 共享,而是采用 redis 等专门的 session 共享方案。
- 扩展策略:
- 除了内置策略外,还可以根据具体业务需求和场景自行设计扩展策略。例如,可以根据服务器的实时负载情况动态调整分配权重,或者根据不同的请求类型(如静态资源请求和动态资源请求)分配到不同的服务器群组等,这需要开发者根据实际情况发挥创意和进行深入的定制开发。
(四)动静分离
- 在软件开发过程中,存在一些请求需要后台进行复杂处理,而另一些请求则无需后台处理,像 CSS、html、jpg、js 等文件这类无需后台处理的文件被称为静态文件。
- 动静分离就是要让动态网站中的动态网页按照一定规则将不变的资源(静态资源)和经常变化的资源(动态资源)区分开来。当完成动静资源的拆分后,我们可以依据静态资源的特性对其进行缓存操作。例如,可以将静态资源缓存到浏览器缓存或者专门的缓存服务器(如 Nginx 自身的缓存模块或 redis 缓存)中。这样一来,当客户端再次请求相同的静态资源时,可以直接从缓存中获取,大大提高了资源响应的速度,减轻了服务器的负担,提升了用户体验。
四、Nginx 安装
- 可以从官方网站 nginx: download 下载 Nginx。建议选择稳定版本进行安装,以确保系统的稳定性和可靠性。
- 对于 Windows 系统,同样可以从上述官方网站下载对应的安装包进行安装。安装过程中按照提示逐步操作即可完成 Nginx 在 Windows 环境下的部署。
五、Nginx 的常用命令
- 启动 Nginx:在 Nginx 安装目录下的可执行文件所在路径,执行命令(如在 Linux 系统中可能是
./nginx
命令)启动 Nginx 服务。 - 停止 Nginx:可以使用
nginx -s stop
命令快速停止 Nginx 服务,但这种方式可能会导致当前正在处理的请求被中断。如果希望优雅地停止 Nginx,即等待当前所有请求处理完成后再停止服务,可以使用nginx -s quit
命令。 - 重新加载配置:当修改了 Nginx 配置文件后,需要使新的配置生效,可以使用
nginx -s reload
命令。该命令会重新读取配置文件并应用新的配置,而不会中断 Nginx 服务的运行,确保服务的连续性。
六、Nginx 实战及总结
Nginx.conf 配置文件主要包含全局配置、event、http 三个大的模块。在 http 模块中,首先是 http 的静态配置部分,其下包含多个 server 端口配置。例如:
# 全局配置部分,可设置一些全局的参数,如 user、error_log 等
user nginx;
error_log /var/log/nginx/error.log warn;
# event 模块配置,可设置网络连接相关参数,如连接数、连接超时等
events {
worker_connections 1024;
}
# http 模块配置
http {
# 静态配置,如设置 MIME 类型等
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 多个 server 端口配置
server {
listen 80;
server_name example.com;
# 具体的 location 配置,定义不同请求路径的处理规则
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 8080;
server_name test.com;
# 其他配置...
}
}
在实际应用中,通过合理配置 Nginx 的反向代理、负载均衡、动静分离等功能,并结合其常用命令进行管理和维护,可以构建出高效、稳定、安全的网络服务架构,满足不同规模和场景下的业务需求。
通过对 Nginx 的学习和实践,我们能够更好地应对网络服务中的各种挑战,提升系统的整体性能和用户体验,为构建强大的网络应用奠定坚实的基础