关于一份nginx-我是如何优化的

需求场景

1、需要负载均衡指定几个服务,如果有服务出现预期错误,就会更换另外一个服务接口

2、合理优化一些细节日志输入和性能

Nginx 配置文件(带注释)

nginx 复制代码
#user  nobody; # 以nobody用户运行Nginx进程
worker_processes  4; # 设置Nginx的工作进程数量为4,根据服务器的CPU核心数量调整。

error_log  logs/error.log error; # 指定错误日志文件路径和记录级别为error
#error_log  logs/error.log notice; # 可选,记录notice级别的日志
#error_log  logs/error.log info; # 可选,记录info级别的日志

pid        logs/nginx.pid; # 指定存储Nginx进程ID的文件路径

events {
    worker_connections  1024; # 每个工作进程允许的最大连接数
}

http {
    include       mime.types; # 包含MIME类型定义文件
    default_type  application/octet-stream; # 设置默认的MIME类型

    log_format upstreamlog '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" '
                           '"$upstream_addr" "$upstream_response_time" "$upstream_status"'; 
    # 定义日志格式,记录上游服务器信息

    access_log logs/access.log upstreamlog; # 指定访问日志文件路径和日志格式

    sendfile        on; # 启用sendfile,提高文件传输效率
    tcp_nopush      on; # 优化TCP包的发送,减少网络包数量(与sendfile结合使用效果最佳)
    tcp_nodelay     on; # 禁用Nagle算法,防止网络包延迟发送

    keepalive_timeout  65; # 设置keep-alive超时时间为65秒

    gzip on; # 启用gzip压缩
    gzip_disable "msie6"; # 禁用IE6的gzip压缩
    gzip_vary on; # 启用Vary: Accept-Encoding头
    gzip_proxied any; # 启用代理请求的gzip压缩
    gzip_comp_level 6; # 设置gzip压缩级别,范围1-9,数字越大压缩率越高但CPU消耗越大
    gzip_buffers 16 8k; # 设置系统获取用于存储gzip压缩结果数据流的内存单位
    gzip_http_version 1.1; # 启用gzip压缩的HTTP协议版本
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 设置需要压缩的MIME类型

    upstream OCR {
        server xxx.xx.158.247:5594; # 定义上游服务器的IP地址和端口
        server xxx.xx.158.247:5595; # 定义上游服务器的IP地址和端口
        server xxx.xx.158.247:5596; # 定义上游服务器的IP地址和端口
        server xxx.xx.158.247:55971; # 定义上游服务器的IP地址和端口
    }

    server {
        listen       80; # 监听80端口
        server_name  localhost; # 定义服务器名称

        location / {
            proxy_pass http://OCR; # 将请求转发到上游服务器集群OCR
            proxy_set_header Host $host; # 设置Host头
            proxy_set_header X-Real-IP $remote_addr; # 设置X-Real-IP头
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置X-Forwarded-For头
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404; # 定义当上游服务器返回特定错误时,将请求转发到下一个上游服务器
            proxy_connect_timeout 10s; # 设置代理连接超时时间为10秒
            proxy_read_timeout 60s; # 设置代理读取超时时间为60秒
            proxy_send_timeout 60s; # 设置代理发送超时时间为60秒
        }

        error_page   500 502 503 504  /50x.html; # 自定义错误页面
        location = /50x.html {
            root   html; # 设置错误页面的根目录
        }
    }
}

详细说明文档

1. 基本设置
  • user nobody;:指定Nginx进程的运行用户为nobody。
  • worker_processes 1;:设置工作进程数为1。
2. 日志设置
  • error_log logs/error.log error;:指定错误日志文件路径和记录级别为error。
  • #error_log logs/error.log notice;:可选,记录notice级别的日志。
  • #error_log logs/error.log info;:可选,记录info级别的日志。
  • pid logs/nginx.pid;:指定存储Nginx进程ID的文件路径。
3. 事件模块
  • worker_connections 1024;:每个工作进程允许的最大连接数。
4. HTTP 核心模块
  • include mime.types;:包含MIME类型定义文件。
  • default_type application/octet-stream;:设置默认的MIME类型。
5. 日志格式
  • log_format upstreamlog ...:定义日志格式,记录上游服务器信息。
  • access_log logs/access.log upstreamlog;:指定访问日志文件路径和日志格式。
6. 文件传输与TCP优化
  • sendfile on;:启用sendfile,提高文件传输效率。
  • tcp_nopush on;:优化TCP包的发送,减少网络包数量(与sendfile结合使用效果最佳)。
  • tcp_nodelay on;:禁用Nagle算法,防止网络包延迟发送。
7. 连接保持
  • keepalive_timeout 65;:设置keep-alive超时时间为65秒。
8. gzip 压缩
  • gzip on;:启用gzip压缩。
  • gzip_disable "msie6";:禁用IE6的gzip压缩。
  • gzip_vary on;:启用Vary: Accept-Encoding头。
  • gzip_proxied any;:启用代理请求的gzip压缩。
  • gzip_comp_level 6;:设置gzip压缩级别,范围1-9,数字越大压缩率越高但CPU消耗越大。
  • gzip_buffers 16 8k;:设置系统获取用于存储gzip压缩结果数据流的内存单位。
  • gzip_http_version 1.1;:启用gzip压缩的HTTP协议版本。
  • gzip_types ...:设置需要压缩的MIME类型。
9. 上游服务器
  • upstream OCR {...}:定义上游服务器集群OCR,包括多个IP地址和端口。
10. 服务器块
  • listen 80;:监听80端口。
  • server_name localhost;:定义服务器名称。
  • location / {...}:配置根路径的代理设置,将请求转发到上游服务器集群OCR,并设置相关头信息和超时。
  • error_page 500 502 503 504 /50x.html;:自定义错误页面。
  • location = /50x.html {...}:设置错误页面的根目录。

调整 worker_processesworker_connections 可以显著提升Nginx的性能和处理能力。以下是调整这两个参数的指南:

worker_processes

  • 定义:这个参数定义了Nginx创建的工作进程数量。
  • 最佳实践:通常设置为等于服务器的CPU核心数量,以便充分利用多核CPU的性能。

worker_connections

  • 定义:这个参数定义了每个工作进程可以同时处理的最大连接数。
  • 最佳实践:应该根据服务器的硬件资源和预期的流量来设置。如果设置得过低,会限制Nginx的并发处理能力。

具体调整步骤

  1. 确定CPU核心数量

    • 在Linux系统中,可以使用以下命令查看CPU核心数量:

      sh 复制代码
      nproc
    • 或者:

      sh 复制代码
      lscpu | grep '^CPU(s):'
  2. 根据核心数量调整 worker_processes

    • 如果服务器有4个CPU核心,worker_processes 应设置为4。
  3. 根据内存和预期流量调整 worker_connections

    • 例如,假设每个连接占用1KB的内存,服务器有8GB的可用内存,可以设置 worker_connections 为8192。
    • 此外,可以通过ulimit -n命令检查文件描述符限制,如果需要可以增加。

详细说明文档更新

1. worker_processes
  • worker_processes 4;:设置Nginx的工作进程数量为4,根据服务器的CPU核心数量调整。
2. worker_connections
  • worker_connections 8192;:设置每个工作进程可以同时处理的最大连接数为8192,根据服务器内存和预期流量调整。
相关推荐
zyl8372110 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry10 小时前
MGRE实验
运维·服务器
stolentime11 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
bush412 小时前
嵌入式linux学习记录四
linux·运维·学习
lihao lihao13 小时前
软硬链接
linux·运维·服务器
TOWE technology13 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子13 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构
大明者省14 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记
晚风吹红霞14 小时前
Linux软件包管理器详解 —— yum与apt的使用及软件生态
linux·运维·服务器
曦夜日长14 小时前
Linux系统篇,进程概念(一):计算机体系、操作系统的认识、程序的加载过程
linux·运维·网络