重定向和重写的区别
nginx 重定向是服务器返回一个新的 url,让客户端重新访问;而重写是服务器内部将 url 改变了,然后再进一步处理更改后的 url。重定向,客户端是有感知的,而重写,客户端是无感知的。
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
rewrite (.*) https://$server_name$1;
配置优化
当涉及到Nginx的配置优化时,有多个方面可以考虑以提高其性能和响应速度。以下是一些常见的Nginx配置优化策略和建议:
nginx 调整上传文件的最大值client_max_body_size 1024M;
- 调整worker_processes和worker_connections:
worker_processes
:这个指令定义了Nginx的工作进程数。通常,将其设置为与CPU核心数相等或两倍于核心数是一个好的开始。但是,具体的设置应该根据服务器的负载和应用程序的特性来确定。任务绑定到 cpu 上,避免频繁切换带来的开销。worker_cpu_affinity 0001 0010 0100 1000;
worker_connections
:这个指令定义了每个工作进程可以处理的最大连接数。根据你的服务器硬件配置和预期的并发连接数来调整这个值。
- 启用Nginx缓存:
- 使用Nginx的代理缓存功能(
proxy_cache
)可以显著提高性能。当Nginx代理请求到后端服务器时,它会将响应存储在本地缓存中,以便在后续请求中快速提供响应。 - 配置缓存时,需要指定缓存目录、缓存有效期等参数。
- 使用Gzip压缩:
- 启用Gzip压缩可以减少传输的数据量,从而提高网络传输速度。在Nginx配置文件中,可以通过
gzip
指令来启用Gzip压缩,并指定要压缩的文件类型。
- 优化静态文件处理:
- 对于常用的静态文件(如图片、CSS、JavaScript等),可以设置较长的缓存有效期,以减少对磁盘的I/O操作和网络传输。在Nginx配置文件中,可以使用
expires
指令来设置缓存有效期。当使用 expires 指令时,Nginx 会自动生成 Expires 头部和相应的 Cache-Control 头部(通常是 max-age)。但是,如果你需要更精细地控制缓存行为,你也可以直接使用 add_header 指令来设置 Cache-Control 头部。
- 调整请求头和响应头:
- 优化请求头和响应头可以减少网络传输的数据量。例如,可以禁用不必要的HTTP头,如
X-Powered-By
,或者限制请求头的长度。
- 启用keepalive连接:
- Keepalive连接允许HTTP/1.1客户端和服务器之间的多个请求/响应通过同一个TCP连接进行传输。这可以减少TCP连接的建立和关闭次数,从而提高性能。在Nginx配置文件中,可以通过
keepalive_timeout
指令来设置keepalive连接的超时时间。
- 限制并发连接数:
- 如果服务器资源有限,可以通过限制并发连接数来防止过载。在Nginx配置文件中,可以使用
limit_conn
模块来限制每个IP地址或特定区域的并发连接数。
- 监控和日志记录:
- 使用Nginx的监控和日志记录功能可以帮助你了解服务器的性能和瓶颈所在。例如,可以使用
stub_status
模块来获取Nginx的状态信息,或者使用日志记录功能来跟踪请求和响应的详细信息。
- 优化SSL/TLS配置:
- 如果你的Nginx服务器使用HTTPS协议提供服务,那么优化SSL/TLS配置也是非常重要的。例如,可以选择使用更高效的SSL/TLS协议版本(如TLSv1.3),启用会话缓存(如
ssl_session_cache
),以及优化加密算法和证书配置等。
- 硬件和操作系统优化:
- 除了Nginx配置优化外,硬件和操作系统的性能也会对Nginx的性能产生影响。例如,确保服务器具有足够的内存和CPU资源,使用高效的磁盘存储解决方案(如SSD),以及优化操作系统的网络参数等都可以提高Nginx的性能。
请注意,以上只是一些常见的Nginx配置优化策略和建议,具体的优化方案应该根据你的服务器环境、应用程序特性和性能需求来确定。
nginx 配置缓存
在Nginx中开启缓存功能,主要涉及到proxy_cache
和proxy_cache_path
等指令的配置。以下是一个详细的步骤说明:
- 安装和启动Nginx:
首先,确保你已经安装了Nginx并启动了Nginx服务。你可以参考Nginx的官方文档进行安装和配置。 - 配置Nginx缓存路径:
在Nginx的配置文件(通常是nginx.conf
或位于某个特定目录下的配置文件)中,使用proxy_cache_path
指令定义缓存路径和缓存配置。这个指令通常在http
块中配置。
示例配置如下:
http {
...
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
...
}
在上述配置中:
/var/cache/nginx
是缓存文件的存储路径。levels=1:2
表示缓存目录的层级结构,这有助于提高缓存管理的效率。keys_zone=my_cache:10m
定义了一个名为my_cache
的缓存区域,并为其分配了10MB的内存空间。这个内存空间用于存储缓存键和相关的元数据。inactive=60m
表示缓存数据在60分钟内没有被访问时,将被视为不活跃并可能被清理。
- 启用缓存功能:
在server
或location
块中,使用proxy_cache
指令来启用缓存功能,并指定要使用的缓存区域。
示例配置如下:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_pass http://backend_server;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}
在上述配置中:
proxy_pass
指令指定了请求应该被转发到的后端服务器地址。proxy_cache
指令启用了缓存功能,并指定了使用my_cache
这个缓存区域。proxy_cache_valid
指令用于指定对于不同状态码的响应,缓存应该持续多长时间。在这个例子中,对于状态码为200和304的响应,缓存有效期被设置为12小时。
- 重启Nginx服务:
完成配置文件的修改后,需要重启Nginx服务以使新的配置生效。你可以通过发送HUP
信号或使用Nginx提供的命令行工具来重启服务。具体的重启方法取决于你的操作系统和Nginx的安装方式。
例如,在Linux系统上,你可以使用以下命令来重启Nginx服务:
sudo service nginx reload
或者
sudo nginx -s reload
这些命令会重新加载Nginx的配置文件,而不会中断正在处理的请求。
请注意,以上步骤是一个基本的Nginx缓存配置过程。根据你的具体需求和环境,你可能还需要进行其他配置和优化。建议参考Nginx的官方文档和相关的最佳实践指南以获取更详细的信息。
ip 透传
在 Nginx 中,IP 透传(也称为客户端 IP 透传或真实 IP 透传)是一种技术,用于在 Nginx 作为反向代理时,将客户端的真实 IP 地址传递给后端服务器。这在许多场景中非常有用,因为后端服务器通常需要知道客户端的真实 IP 地址,而不是仅知道 Nginx 代理服务器的 IP 地址。
Nginx IP 透传的实现
在 Nginx 的配置中,IP 透传主要通过在代理请求时设置特定的请求头来实现。具体来说,你可以在 Nginx 的配置文件中使用 proxy_set_header
指令来添加或修改请求头。
以下是一个简单的示例,展示了如何在 Nginx 配置中实现 IP 透传:
location / {
proxy_pass http://backend_server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# 其他相关配置...
}
在这个示例中:
proxy_pass
指令指定了请求应该被转发到的后端服务器地址。proxy_set_header X-Real-IP $remote_addr;
这行配置将客户端的真实 IP 地址(由$remote_addr
变量提供)添加到X-Real-IP
请求头中,并发送给后端服务器。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这行配置用于处理经过多个代理服务器的情况。$proxy_add_x_forwarded_for
变量包含了客户端 IP 地址(如果存在)以及之前所有代理服务器的 IP 地址(以逗号分隔)。这个请求头允许后端服务器知道请求经过了哪些代理服务器,并始终获取到客户端的原始 IP 地址。proxy_set_header Host $host;
这行配置用于将原始请求的Host
头传递给后端服务器,以确保后端服务器能够正确处理请求。
Nginx IP 透传的原理
Nginx IP 透传的原理是,当 Nginx 代理服务器接收到来自客户端的请求时,它会根据配置文件中的设置,将客户端的真实 IP 地址添加到请求头中,并将请求转发给后端服务器。后端服务器在接收到请求后,可以从请求头中提取出客户端的真实 IP 地址,从而知道请求的真正来源。
在 Nginx 的配置中,X-Real-IP
和 X-Forwarded-For
是两个常用的请求头,用于传递客户端的真实 IP 地址。其中,X-Real-IP
通常用于传递客户端的原始 IP 地址(未经代理),而 X-Forwarded-For
则用于传递经过多个代理服务器的 IP 地址链。后端服务器在接收到这些请求头后,可以根据需要进行相应的处理。
Nginx 负载均衡算法
静态算法
**ip_hash 算法:**只使用 IPV4 的前 24 位做 hash 运算,如果客户端IP前24位一致,则会被调度到同一台后
端服务器
upstream group1{
ip_hash;
server 10.0.0.210;
server 10.0.0.159;
}
通用 Hash 算法:
- 类似于 IP 哈希,但它是基于其他参数(如 URI)计算哈希值来选择后端服务器。
- 适用于需要基于特定请求参数进行负载均衡的场景。
三台 server 权重一样,调度算法 hash($remoute_addr)%3,值为 0,1,2根据不同的值调度到不同 server
upstream group1{
hash $remote_addr;
server 10.0.0.210 weight=1;
server 10.0.0.159 weight=2;
server 10.0.0.213 weight=3;
}
RR 算法(轮询算法)
upstream group1{
server 10.0.0.210;
server 10.0.0.159;
server 10.0.0.213;
}
WRR 算法(加权轮询算法)
upstream group1{
server 10.0.0.210 weight=1;
server 10.0.0.159 weight=2;
server 10.0.0.213 weight=3;
}
动态算法
最少连接调度算法:
upstream group1{
least_conn;
server 10.0.0.210;
server 10.0.0.159;
}
限流限速
限制下载速度
limit_rate
#对单个客户端连接限速,默认单位为字节,其它单位需要显式指定,表示每秒的下载速度
limit_rate rate;
limit_rate_after size;
server{
listen 80;
server_name www.m99-magedu.com;
root /var/www/html/www.m99-magedu.com;
limit_rate 10k; #每秒下载速度为10K
limit_rate_after 1m; #前1M不开启限速
}
限制每秒处理请求数
limit_req
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server{
listen 80;
server_name www.m99-magedu.com;
root /var/www/html/www.m99-magedu.com;
limit_req zone=mylimit; #调用
#limit_req zone=mylimit burst=3
}
}
会话保持
会话保持就是为了每次访问 Web 时,服务器中能有对应客户端的 Session 信息,存储客户端的相应状态信息,因为 http 协议是无状态的,为了保持客户端的状态,采用了 cookie 和 session 的机制,来使其变得有状态。
会话粘滞
ip_hash
hash $cookie
hash $remote_addr
会话复制
Tomcat 服务器特有的功能,Session 复制。
会话服务器
Session 服务器(在 Web 服务器外,单独部署),Redis Session 集群(存储客户端的状态信息)
Nginx 配置
虚拟主机的配置
未配置 SSL
nginx主配置文件**myserver.conf**
server {
listen 8080;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
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;
}
}
server {
listen 8888;
server_name www.wang.org;
include /etc/nginx/conf.d/myserver-*.cfg;
location / {
root /usr/share/nginx/html;
}
}
配置 SSL
nginx主配置文件**myserver.conf**
server {
listen 80;
server_name www.wang.org;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.wang.org;
ssl_certificate /etc/nginx/certs/tls.crt;
ssl_certificate_key /etc/nginx/certs/tls.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
include /etc/nginx/conf.d/myserver-*.cfg;
location / {
root /usr/share/nginx/html;
}
}
压缩配置
开启 nginx gzip 压缩后,网页、css、js 等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。虽然会消耗cpu资源,但是为了给用户更好的体验是值得的。
开启的配置如下:
http {
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
gzip_min_length 1k;
# gzip 压缩级别 1-10
gzip_comp_level 2;
# 进行压缩的文件类型。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
}
状态页配置
nginx的状态页配置文件myserver-status.cfg
location /nginx-status {
stub_status on;
access_log off;
}
location 匹配请求的URL路径的优先级
通过 nginx 解决跨域问题
简单介绍一下什么叫跨域:在一次请求中返回了一个 html 页面,但是在页面中又嵌套了其它资源,通过 url 来嵌入的,嵌套资源的 url 如果和请求 html 页面的 url 的协议、域名(ip 地址)和端口号有一个不同的话就叫做跨域。浏览器为了安全有一个叫同源策略的东西,字面意思是访问的资源需要是同一个来源,因此浏览器是禁止跨域的。解决跨域问题有很多种方式,这里简单介绍一下如何通过 nginx 进行跨域。
nginx 跨域其实很简单,就是让浏览器本来要访问一个跨域资源的 url 变成访问同源的 nginx 的 url,然后再由 nginx 反向代理到跨域资源的 url 地址。 这样在浏览器的视角看访问的资源就不是跨域资源了。
nginx 配置健康状态检查
社区版不支持内置的健康检查功能,需要使用第三方模块如 nginx_upstream_check_module
- 下载 NGINX 源码和 ngx_http_upstream_check_module 模块。
- 编译 NGINX 并添加 ngx_http_upstream_check_module 模块。
# 下载 NGINX 源码
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar zxvf nginx-1.20.1.tar.gz
# 下载模块源码
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
# 打补丁并编译
cd nginx-1.20.1
patch -p1 < ../nginx_upstream_check_module/check_1.20.1+.patch
./configure --add-module=../nginx_upstream_check_module
make
sudo make install
配置健康性检查
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
# 开启访问日志和错误日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
}
重新加载配置
sudo nginx -t # 测试配置是否正确
sudo nginx -s reload # 重新加载配置
反向代理 proxy_pass 后面加斜线和不加斜线的区别
# 没有斜线是追加
# http://www.wzx.com/api/index.html ----> http://api.wzx.com/api/index.html
location /api{
proxy_pass http://10.0.0.159;
proxy_set_header Host "api.wzx.com";
}
#有斜线是替换
# http://www.wzx.com/api/index.html -----> http://api.wzx.com/index.html
location /api{
proxy_pass http://10.0.0.159/;
proxy_set_header Host "api.wzx.com";
}