Nginx是什么?
Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的,最初是为了解决俄罗斯大型的门户网站的高流量问题。
说到反向代理,那么有没有正向代理呢?
-
正向代理:客户端非常明确要访问的服务器地址;服务器只知道请求来自哪个服务器(不知道哪个客户端);正向代理屏蔽或者隐藏了真实客户端。例如:当我们无法直接访问国外网站时,我们需要通过代理服务器(FQ)来访问,通过代理服务器去访问我们指定的网址。
-
反向代理:多个客户端向反向代理服务器发送请求,Nginx 根据一定的规则将请求分发到不同的服务器;客户端不清楚请求将被分发到哪台服务器,反向代理隐藏了服务器的信息。
正向代理代理客户端的请求去访问目标服务器,目标服务器可能是一个反向服务器,反向代理了多台真实的服务器。
说到反向代理,不得不说下负载均衡,毕竟利用好反向代理,可以完美解决流量高并发的问题!
负载均衡
总说负载均衡,负载均衡是做什么用的?什么场景使用?
负载均衡是用来分配客户端请求到多个服务器的机制,常用于解决高负载和提高系统可用性的问题。
- 负载量:客户端发送的请求数量,也是负载量。
- 均衡规则:反向代理服务器根据一定的规则将请求分发到不同的服务器上处理。
- 负载均衡可分为硬件负载均衡(成本较高)和软件负载均衡(成本较低)。
- 软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx的核心要点
1、事件驱动
Nginx使用了一个高效的异步事件模型,基于I/O多路复用,特别是epoll(在Linux上)和kqueue(在BSD系统上)。这种模型允许Nginx同时处理大量的并发连接,而不会因为每个连接占用大量的内存资源。
在Nginx配置文件中,可以设置每个进程的最大连接数(worker_connections
),以及如何处理并发连接:
events {
worker_connections 1024; # 每个进程最多同时处理1024个连接
}
2、高度可扩展
Nginx能够支持同时处理成千上万个连接,这使得它非常适合大型网站和需要高并发处理能力的应用。
Nginx 可以为不同的虚拟主机设置不同的worker进程数,以增加并发处理能力:
http {
worker_processes auto; # 根据系统CPU核心数自动设置worker进程数
}
3、轻量级
与传统的基于进程的Web服务器(如Apache)相比,Nginx在处理请求时占用的内存更少。这是因为Nginx使用事件驱动模型,每个连接只占用很小的内存空间。比如说可以设置每个worker进程的内存限制:
events {
worker_rlimit_nofile 1024; # 每个worker进程的最大打开文件描述符数
}
4、热部署
Nginx支持热部署,即在不重启服务器的情况下更新配置和模块。要实现热部署,可以使用 nginx -s ``reload
命令。在修改了Nginx配置文件后,可以通过以下命令热部署配置:
sudo nginx -s reload
5、负载均衡
Nginx内置了负载均衡功能,可以通过upstream
模块在多个后端服务器之间分配客户端请求,以此提高整个服务系统的处理能力。以下是一个简单的upstream配置,它将请求轮询分配到三个后端服务器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend; # 将请求转发到upstream定义的backend组
}
}
6、高性能
Nginx在多种标准的Web性能测试中表现出色,能够快速处理静态文件、索引文件和代理请求。配置Nginx作为反向代理服务器,为大型静态文件下载服务:
location /files/ {
alias /path/to/files/; # 设置实际文件存储路径
expires 30d; # 设置文件过期时间为30天
}
7、安全性,Nginx支持SSL/TLS协议
Nginx支持SSL/TLS协议,可以配置为安全的Web服务器或反向代理。
server {
listen 443 ssl;
ssl_certificate /path/to/fullchain.pem; # 证书路径
ssl_certificate_key /path/to/privatekey.pem; # 私钥路径
ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议
}
Nginx支持的复杂均衡调度算法
Nginx支持多种复杂的负载均衡调度算法,以适应不同的应用场景和需求。以下是几种常见的负载均衡算法的详细说明和示例:
1、weight轮询(默认)
weight轮询(Round Robin)是Nginx默认的负载均衡算法。它按顺序将请求逐一分配到不同的服务器上。通过设置服务器权重(weight)来调整不同服务器上请求的分配率。如果某一服务器宕机,Nginx会自动将该服务器从队列中剔除,请求代理会继续分配到其他健康的服务器上。
upstream backend {
server backend1.example.com weight=3; # 设置backend1的权重为3
server backend2.example.com; # backend2的权重为默认值1
server backend3.example.com weight=5; # 设置backend3的权重为5
}
2、IP Hash
IP Hash算法根据客户端请求的IP地址的哈希值进行匹配,将具有相同IP哈希值的客户端分配到指定的服务器。这样可以确保同一客户端的请求始终被分配到同一台服务器,有助于保持用户的会话状态。
upstream backend {
ip_hash; # 启用IP哈希算法
server backend1.example.com;
server backend2.example.com;
}
3、fair
fair 调度算法是一种根据服务器处理请求的响应时间和处理效率进行负载均衡的方法。它结合了轮询和IP哈希的优点,但Nginx默认不支持公平调度算法,需要安装额外的模块(upstream_fair)来实现。
upstream backend {
fair; # 启用公平调度算法
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
4、URL Hash
URL Hash 算法根据访问的URL的哈希结果分配请求。每个请求的URL会被分配到指定的服务器,这有助于提高缓存效率。但这种方法需要安装Nginx的hash软件包。
upstream backend {
hash $request_uri; # 启用URL哈希算法
server backend1.example.com;
server backend2.example.com;
}
# 根据请求的URL哈希值来决定将请求发送到backend1还是backend2。
Nginx实践
Nginx 通过配置 .conf 静态文件运行(如/usr/local/nginx/conf/vhost/admin.conf)。
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80; # 服务端口号
client_max_body_size 100m; # body请求数据大小
index index.html; # 项目地址
root /user/project/admin; # 项目根目录地址
# 路由配置
location ~ /* {
proxy_pass http://127.0.0.1:3001; # 代理服务地址 proxy_pass http://backend_servers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location ~ .*.(gif|jpg|jpeg|png|swf)$ {
expires 1d;
}
location ~ .*.(js|css)?$ {
expires 24h;
}
location ~ /.well-known {
allow all;
}
location ~ /. {
deny all;
}
access_log /user/logs/admin.log; # 记录日志
}
配置详情如下:
server:定义一个虚拟主机的配置块,一个 HTTP 中可以配置多个 server。
listen 80:设置服务端监听的端口号为 80。
client_max_body_size 100m:设置请求中允许的最大 body 大小为 100 MB。
index index.html:设置项目地址的默认文件为 index.html。
root /user/project/admin:指定项目根目录的路径。
location /:配置请求路径为 / 的 location 块。
- proxy_pass http://127.0.0.1:3001:将请求代理到地址的后端服务器。
- proxy_redirect off:关闭代理重定向。
- proxy_set_header:设置代理请求头。
- proxy_next_upstream:定义当后端服务器返回错误时,Nginx 将如何处理请求。
- proxy_max_temp_file_size:设置允许的最大临时文件大小。
- proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout:定义代理连接、发送和读取超时时间。
- proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size:设置代理缓冲区的大小。
- proxy_temp_file_write_size:设置代理临时文件的写入大小。
location ~ .*.(gif|jpg|jpeg|png|swf)$:配置请求以 .gif、.jpg、.jpeg、.png 或 .swf 结尾的文件的 location 块。
- expires 1d:设置这些文件的过期时间为 1 天。
location ~ .*.(js|css)?$:配置请求以 .js 或 .css 结尾的文件的 location 块。
- expires 24h:设置这些文件的过期时间为 24 小时。
location ~ /.well-known:配置请求以 /.well-known 开头的路径的 location 块。
- allow all:允许所有请求访问该路径。
location ~ /. :配置以 . 开头的路径的 location 块。
- deny all:禁止所有请求访问该路径。
access_log /user/logs/admin.log:指定记录日志的路径为 /user/logs/admin.log。
Nginx 配置的实战案例通常涉及多种场景,包括但不限于静态资源服务、反向代理、负载均衡、HTTPS 配置、安全防护等。以下是一些常见的 Nginx 配置实战案例:
静态资源服务
server {
listen 80;
server_name example.com;
location / {
root /path/to/your/static/files;
index index.html index.htm;
}
location ~* \.(jpg|png|gif|jpeg)$ {
expires 30d;
add_header Cache-Control "public";
}
}
在这个案例中,Nginx 配置为服务静态文件,如 HTML、CSS、JavaScript 和图片等。通过设置 root
指令,指定了静态文件的根目录。同时,对于图片文件,通过 expires
指令设置了缓存时间为 30 天,减少了服务器的负载和用户等待时间。
反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这个案例展示了如何配置 Nginx 作为反向代理服务器。当客户端请求 api.example.com
时,Nginx 会将请求转发到后端服务器集群。通过设置 proxy_set_header
,可以修改客户端请求的头部信息,确保后端服务器能够正确处理请求。
负载均衡
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
在这个负载均衡的案例中,Nginx 将请求分发给多个后端服务器。通过 upstream
指令定义了一个服务器组,然后在 location
块中使用 proxy_pass
指令将请求代理到这个服务器组。Nginx 支持多种负载均衡策略,如轮询(默认)、IP 哈希等。
HTTPS 配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
location / {
root /path/to/your/https/static/files;
index index.html index.htm;
}
}
这个案例展示了如何配置 Nginx 以支持 HTTPS。通过指定 SSL 证书和私钥的路径,以及设置 SSL 协议和加密套件,可以确保数据传输的安全。同时,建议使用 HTTP/2 协议以提升性能。
安全防护
server {
listen 80;
server_name example.com;
location / {
# ... 省略其他配置
# 防止 SQL 注入等攻击
rewrite ^/(.*)$ /index.php?param=$1 break;
# 限制请求方法,只允许 GET 和 POST
if ($request_method !~ ^(GET|POST)$ ) {
return 444;
}
# 防止跨站请求伪造
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
}
}
在这个安全防护的案例中,Nginx 配置了多种安全增强措施。通过 rewrite
指令,可以防止一些常见的 Web 攻击,如 SQL 注入。通过限制请求方法,可以减少服务器被恶意利用的风险。同时,添加了一些 HTTP 头部来增强浏览器安全,如防止点击劫持、MIME 类型嗅探和跨站脚本攻击(XSS)。
这些案例仅是 Nginx 配置的冰山一角。N