nginx

重定向和重写的区别

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;

  1. 调整worker_processes和worker_connections
  • worker_processes:这个指令定义了Nginx的工作进程数。通常,将其设置为与CPU核心数相等或两倍于核心数是一个好的开始。但是,具体的设置应该根据服务器的负载和应用程序的特性来确定。任务绑定到 cpu 上,避免频繁切换带来的开销。worker_cpu_affinity 0001 0010 0100 1000;
  • worker_connections:这个指令定义了每个工作进程可以处理的最大连接数。根据你的服务器硬件配置和预期的并发连接数来调整这个值。
  1. 启用Nginx缓存
  • 使用Nginx的代理缓存功能(proxy_cache)可以显著提高性能。当Nginx代理请求到后端服务器时,它会将响应存储在本地缓存中,以便在后续请求中快速提供响应。
  • 配置缓存时,需要指定缓存目录、缓存有效期等参数。
  1. 使用Gzip压缩
  • 启用Gzip压缩可以减少传输的数据量,从而提高网络传输速度。在Nginx配置文件中,可以通过gzip指令来启用Gzip压缩,并指定要压缩的文件类型。
  1. 优化静态文件处理
  • 对于常用的静态文件(如图片、CSS、JavaScript等),可以设置较长的缓存有效期,以减少对磁盘的I/O操作和网络传输。在Nginx配置文件中,可以使用expires指令来设置缓存有效期。当使用 expires 指令时,Nginx 会自动生成 Expires 头部和相应的 Cache-Control 头部(通常是 max-age)。但是,如果你需要更精细地控制缓存行为,你也可以直接使用 add_header 指令来设置 Cache-Control 头部。
  1. 调整请求头和响应头
  • 优化请求头和响应头可以减少网络传输的数据量。例如,可以禁用不必要的HTTP头,如X-Powered-By,或者限制请求头的长度。
  1. 启用keepalive连接
  • Keepalive连接允许HTTP/1.1客户端和服务器之间的多个请求/响应通过同一个TCP连接进行传输。这可以减少TCP连接的建立和关闭次数,从而提高性能。在Nginx配置文件中,可以通过keepalive_timeout指令来设置keepalive连接的超时时间。
  1. 限制并发连接数
  • 如果服务器资源有限,可以通过限制并发连接数来防止过载。在Nginx配置文件中,可以使用limit_conn模块来限制每个IP地址或特定区域的并发连接数。
  1. 监控和日志记录
  • 使用Nginx的监控和日志记录功能可以帮助你了解服务器的性能和瓶颈所在。例如,可以使用stub_status模块来获取Nginx的状态信息,或者使用日志记录功能来跟踪请求和响应的详细信息。
  1. 优化SSL/TLS配置
  • 如果你的Nginx服务器使用HTTPS协议提供服务,那么优化SSL/TLS配置也是非常重要的。例如,可以选择使用更高效的SSL/TLS协议版本(如TLSv1.3),启用会话缓存(如ssl_session_cache),以及优化加密算法和证书配置等。
  1. 硬件和操作系统优化
  • 除了Nginx配置优化外,硬件和操作系统的性能也会对Nginx的性能产生影响。例如,确保服务器具有足够的内存和CPU资源,使用高效的磁盘存储解决方案(如SSD),以及优化操作系统的网络参数等都可以提高Nginx的性能。

请注意,以上只是一些常见的Nginx配置优化策略和建议,具体的优化方案应该根据你的服务器环境、应用程序特性和性能需求来确定。

nginx 配置缓存

在Nginx中开启缓存功能,主要涉及到proxy_cacheproxy_cache_path等指令的配置。以下是一个详细的步骤说明:

  1. 安装和启动Nginx
    首先,确保你已经安装了Nginx并启动了Nginx服务。你可以参考Nginx的官方文档进行安装和配置。
  2. 配置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分钟内没有被访问时,将被视为不活跃并可能被清理。
  1. 启用缓存功能
    serverlocation块中,使用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小时。
  1. 重启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-IPX-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

  1. 下载 NGINX 源码和 ngx_http_upstream_check_module 模块。
  2. 编译 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";
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值