当前位置: 首页 > news >正文

Nginx 优化

一、调整工作进程数和线程数

Nginx采用异步非阻塞的方式处理请求,这种方式可以充分利用CPU资源,提高并发处理能力。但是,过多的工作进程和线程会导致系统资源浪费,降低性能。因此,需要根据实际情况调整Nginx的工作进程数和线程数。

调整工作进程数

Nginx的工作进程数是指Nginx启动后生成的子进程数量。可以通过修改Nginx配置文件中的worker_processes参数来调整工作进程数。eg: worker_processes 4;

调整线程数

每个工作进程都有一个默认的线程数,即Nginx的事件处理模型中包含的线程数。可以通过修改Nginx配置文件中的worker_connections参数来调整线程数。eg: worker_connections 1024;

注意: 线程数并不是越大越好,因为线程之间的竞争可能会导致性能下降。因此根据实际情况进行调整。

二、启用Gzip压缩

Gzip压缩是一种常用的网页压缩技术,可以减少传输的数据量,提高页面加载速度。Nginx支持Gzip压缩功能,可以通过配置Nginx来实现。

安装Gzip模块

首先需要在编译Nginx时安装Gzip模块。在Linux系统中,可以使用以下命令安装:

./configure --with-http_gzip_static_module --with-http_gzip_module
make && make install

配置Gzip压缩

在Nginx配置文件中添加以下内容:

http {
    gzip on; # 开启Gzip压缩功能
    gzip_min_length 1k; # 设置最小压缩文件大小为1KB
    gzip_buffers 4 16k; # 设置压缩缓冲区个数和大小
    gzip_http_version 1.1; # 设置支持的HTTP协议版本为1.1
    gzip_comp_level 2; # 设置压缩级别为2(速度与压缩率的平衡)
    gzip_types text/plain application/x-javascript text/css application/xml; # 设置压缩的文件类型
}

三、配置缓存策略

缓存是提高网站性能的重要手段之一。Nginx提供了多种缓存策略,可以根据实际需求进行配置。以下是一些常见的缓存策略:

配置浏览器缓存时间

通过设置HTTP响应头中的ExpiresCache-Control字段,可以控制浏览器缓存的时间。

例如:location ~* \.(jpg|jpeg|gif|png|css|js)$ {
    add_header Cache-Control "public, max-age=31536000"; # 设置静态资源的缓存为1年
}

配置代理服务器缓存时间

如果Nginx作为反向代理服务器使用,可以通过设置proxy_cache_validproxy_cache_valid指令来控制代理服务器的缓存时间。

例如:location / {
    proxy_pass http://backend; # 将请求转发到后端服务器
    proxy_cache mycache; # 启用缓存,命名为mycache
    proxy_cache_valid 200 302 60m; # 设置缓存有效时间为60分钟
    proxy_cache_valid 404 1m; # 设置缓存有效时间为1分钟
}

四、其他配置优化

使用高效的I/O模型

在Linux上使用`epoll`,在FreeBSD上使用`kqueue`,在Windows上使用`iocp`,例如:

events { use epoll; worker_connections 10240;     }

启用Keepalive连接

保持与客户端和上游服务器的长连接,以减少连接建立和关闭的开销:

keepalive_timeout 65;     keepalive_requests 100;

优化缓冲区大小

调整缓冲区大小以减少磁盘I/O操作:

client_body_buffer_size 128k;

client_header_buffer_size 1k;     

large_client_header_buffers 48k;

启用文件缓存

缓存打开的文件描述符,以减少文件打开和关闭的开销

open_file_cache max=1000 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 2;     

open_file_cache_errors on;

启用HTTP/2

如果客户端支持,启用HTTP/2以提高并发性能:listen 443 ssl http2;

启用NginX状态模块

监控NginX的运行状态,以及时发现和解决性能瓶颈。

location /nginx_status { stub_status on; allow 127.0.0.1; deny all;     }

五、优化文件访问方式

处理静态文件时,Nginx默认会将文件读取到内存中进行处理。这种方式在大文件或高并发情况下会导致内存消耗过大,影响性能。因此,采用优化文件访问方式来提高性能。以下是一些方法:

使用sendfile()函数发送文件

sendfile()函数可以直接将文件从磁盘读取并发送到网络,避免了数据在用户空间和内核空间之间的拷贝,提高了性能。可以通过在Nginx配置文件中添加以下内容来启用sendfile()函数:

http {  sendfile on; # 开启sendfile()函数支持功能(需要操作系统支持)}

启用sendfile_max_chunk和tcp_nopush参数

通过设置sendfile_max_chunktcp_nopush参数,可以控制Nginx在发送文件时的最大分片大小和TCP_CORK选项。

例如:http {         sendfile_max_chunk 1m; # 设置最大分片大小为1MB
                            tcp_nopush on; # 开启TCP_CORK选项        }

六、优化日志配置

日志是排查问题的重要手段,但是过多的日志会导致磁盘空间不足,影响系统性能。因此,需要对Nginx的日志进行优化。以下是一些优化方法:

调整日志级别

Nginx支持多种日志级别,如debuginfonoticewarnerror等。可以通过修改Nginx配置文件中的log_level参数来调整日志级别。

http {   log_level info; # 将日志级别设置为info        }

配置日志切割和压缩

为了减少日志占用的磁盘空间,可以配置日志切割和压缩功能。例如:# 配置访问日志切割和压缩功能

http {  access_log /var/log/nginx/access.log combined buffer=32k flush=1m; 
    error_log /var/log/nginx/error.log info; # 配置错误日志,并设置日志级别为info        }

使用日志分析工具

使用日志分析工具,如GoAccess或AWStats,分析访问日志,找出性能瓶颈和优化点。

七、负载均衡策略配置

NGINX开源支持四种负载平衡方法,而NGINX Plus又增加了两种方法。

  • upstream xxxx:定义一个名称,随意就行;

  • server + ip:端口 or 域名

1.Round Robin: 对所有的请求进行轮询发送请求,默认的分配方式。

upstream xxxx {
   server 192.168.1.115:9080;
   server www.xxx.xxx.x.com; }

2.Least Connections:以最少的活动连接数将请求发送到服务器,同样要考虑服务器权重。

upstream xxxx {
    least_conn;
   server 192.168.1.115:9080;
   server www.xxx.xxx.x.com; }

3.IP Hash : 发送请求的服务器由客户机IP地址决定。在这种情况下,使用IPv4地址的前三个字节或整个IPv6地址来计算散列值。该方法保证来自相同地址的请求到达相同的服务器,除非该服务器不可用。

upstream xxxx {
     ip_hash;
    server 192.168.1.115:9080;
    server www.xxx.xxx.x.com; }

4.Generic Hash: 请求发送到的服务器由用户定义的键决定,该键可以是文本字符串、变量或组合.

 upstream xxxx {
      hash $request_uri consistent;
      server 192.168.1.115:9080;
      server www.xxx.xxx.x.com; }

5.Random:每个请求将被传递到随机选择的服务器。如果指定了两个参数,首先,nginx根据服务器权重随机选择两个服务器,然后使用指定的方法选择其中一个。

  • least_conn :活动连接的最少数量

  • least_time=header (nginxPlus):从服务器接收响应标头的最短平均时间 ($upstream_header_time)

  • least_time=last_byte (NGINX Plus) :从服务器接收完整响应的最短平均时间($upstream_response_time)

    upstream xxxx { random two least_time=last_byte;   server 192.168.1.115:9080;
          server www.xxx.xxx.x.com; }

八、nginx配置样例

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 100m;
    sendfile        on;
    keepalive_timeout  300;
    
    upstream zw_search_location1 {
     server 1xx.168.1.166:1237 weight=1 max_fails=1 fail_timeout=30s;
     #server 140.32.16.38:xxxx weight=1 max_fails=1 fail_timeout=30s;
     keepalive 500;
     }
    # 适配器路由
    upstream zw_adapter_location1 {
     server 192.168.1.1xx:8084 weight=1 max_fails=1 fail_timeout=30s;
     keepalive 500;
    }

      server {
        listen       80;
        server_name  localhost;
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' '*';
        add_header 'Access-Control-Allow-Headers' '*';
        add_header 'Access-Control-Expose-Headers' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        gzip on;
        gzip_static on;     # 需要http_gzip_static_module 模块
        gzip_min_length 1k;
        gzip_comp_level 4;
        gzip_proxied any;
        gzip_types text/plain text/xml text/css;
        gzip_vary on;
        gzip_http_version   1.0; #兼容多层nginx 反代
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";
        
         root /data;
         index index.html index.htm index.php;
            
            location / {
                 add_header 'Access-Control-Allow-Origin' '*';
                root /usr/share/nginx/html;
                index index.html index.htm;
                try_files $uri $uri/ /index.html;
            }
            
            location /pageOfficeApi {
                proxy_pass http://192.168.1.151:32443/base-auth;
            }
             #增加图片路由代理
            location /hlk-xihai-dev {
                proxy_pass http://192.168.1.157:9000;
            }     
            
             location /changxieoffice/ {
                        rewrite /changxieoffice/(.*) /$1  break;
                        proxy_pass http://192.168.1.151:30090;
                        proxy_redirect     off;
                        client_max_body_size 100m;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Host $http_host/changxieoffice;
                        proxy_set_header X-Forwarded-Proto $scheme;
             }
             
            location /doc {
                    proxy_pass  http://192.168.1.151:30090;
                    #proxy_pass  http://192.168.1.154:3009;
                    proxy_redirect off;
                    client_max_body_size 100m;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Host $http_host/changxieoffice;
                    proxy_set_header X-Forwarded-Proto $scheme;
                }
                    
             #增加图片路由代理
            location /test {
                proxy_pass http://192.168.1.157:9000;
            }
            ## 代理JingWu系统前端,客户端点击通过同一个web平台端口直接代理到具体系统内部
             location /jwxt/ {
                          rewrite /jwxt/(.*) /$1  break;
                        proxy_pass http://192.168.1.151:31571;
                        proxy_redirect     off;
                        client_max_body_size 100m;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_set_header Host $http_host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Host $http_host;
                        proxy_set_header X-Forwarded-Proto $scheme;          
            }
                     
            
     location /ifly-dmt-admin{             
        proxy_pass http://ifly_dmt_location/ifly-zw-admin/;             
        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_read_timeout 300;             
        proxy_send_timeout 300;             
        proxy_max_temp_file_size 200m;             
        client_max_body_size 200m; 
        proxy_connect_timeout 300;      
        proxy_buffer_size 126k;          
        proxy_buffers 4 512k; 
#        proxy_busy_buffers_size 1024;     
        proxy_temp_file_write_size 2048k;      
        proxy_http_version 1.1;
                 
        proxy_set_header Connection "";
        
    }
#元数据管理
    location /metadata {
         add_header Cache-Control 'no-cache';
         alias /usr/share/nginx/html/dataims-web/metadata;
         index index.html index.htm;
         try_files $uri $uri/ /metadata/index.html;
         location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff)$ {
            expires 365d;
         }
    }
  
#数据标准管理
    location /datast {
         alias /usr/share/nginx/html/dataims-web/datast;
         index index.html index.htm;
         try_files $uri $uri/ /datast/index.html;
    }
#数据资产管理
    location /data-assets {
         alias /usr/share/nginx/html/dataims-web/data-assets;
         index index.html index.htm;
         try_files $uri $uri/ /data-assets/index.html;
    }
location /ifly-search-web {
         proxy_pass http://zw_search_location1/ifly-search-web;
          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_read_timeout 120;
          proxy_send_timeout 120;
          proxy_max_temp_file_size 200m;
          client_max_body_size 200m; # 允许客户端请求的最大单文件字节数
          proxy_connect_timeout 120; # nginx跟后端服务器连接超时时间(代理连接超时)
          proxy_buffer_size 126k; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
          proxy_buffers 4 512k; # proxy_buffers缓冲区,网页平均在512k以下的设置
          proxy_busy_buffers_size 1024k; # 高负荷下缓冲大小(proxy_buffers*2)
          proxy_temp_file_write_size 2048k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
          # chunked_transfer_encoding off; # 指定是否在响应时启用chunked编码(只能用于HTTP1.1版本)。
          #           #           proxy_hide_header X-Frame-Options;
                proxy_http_version 1.1;
                   proxy_set_header Connection "";
          add_header 'Access-Control-Allow-Origin' '*';
             add_header 'Access-Control-Allow-Credentials' 'true';
              add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
              add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
         }

#集成平台
location /data-collector {
         add_header Cache-Control 'no-cache';
         alias /usr/share/nginx/html/dataims-web/data-collector;
         index index.html index.htm;
         try_files $uri $uri/ /data-collector/index.html;
         location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff)$ {
            expires 365d;
         }
    }

location /search-web {
         alias /usr/share/nginx/html/dataims-web/zstp-web/search-web;
         index index.html index.htm;
         try_files $uri $uri/ /search-web/index.html;
    }
location /bqpt-web {
          proxy_pass http://192.168.1.166:8086/bqpt-web/;
          add_header Access-Control-Allow-Origin 192.168.1.166;
     add_header Access-Control-Allow-Methods 'GET, POST, PUT, OPTIONS, DELETE, HEAD, TRACE, CONNECT';
     add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authoriz
ation'; }
    }

}


http://www.mrgr.cn/news/96306.html

相关文章:

  • Java基础 3.28
  • C++指针(五)完结篇
  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档
  • 数据结构与算法:1,选择排序
  • 菜鸡前端计算机强基计划之CS50 第七课 python 入门—— Python 中文件操作专题学习
  • 基于SpringBoot的“交通旅游订票系统”的设计与实现(源码+数据库+文档+PPT)
  • linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像
  • 5.0 WPF的基础介绍1-Grid,Stack,button
  • flink 分组窗口聚合 与 窗口表值函数聚合 的区别
  • Codeforces Round 1013 (Div. 3)-F
  • 06-SpringBoot3入门-常见注解(简介)
  • 典范硬币系统(Canonical Coin System)→ 贪心算法
  • 【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析
  • 如何一键安装所有Python项目的依赖!
  • GenBI 中如何引入 LLM 做意图路由,区分查数据还是闲聊
  • 【C#】Task 线程停止
  • 构建高可用性西门子Camstar服务守护者:异常监控与自愈实践
  • Audacity Nyquist插件开发:定义输入框和获取用户输入
  • #VCS# 关于 +incdir+xxx 编译选项的注意点