Skip to content

TIP

高性能、高稳定性、轻量级开源网页服务器,广泛用作反向代理、负载均衡器和HTTP缓存。

yum install nginx

nginx -v 验证

配置文件路径

路径用途
/etc/logrotate.d/nginxNginx日志轮转配置
/etc/nginx/Nginx配置文件目录
/etc/nginx/nginx.confNginx主配置文件,实际使用的文件
/etc/nginx/nginx.conf.defaultNginx默认主配置文件,用于备份被覆盖
/etc/nginx/conf.d/Nginx虚拟主机配置目录
/etc/nginx/conf.d/default.confNginx默认虚拟主机配置文件
/etc/nginx/mime.typesNginx MIME类型配置文件
/var/log/nginx/Nginx日志目录
/var/cache/nginx/Nginx缓存目录
/usr/share/nginx/Nginx默认的HTML文件和模块目录

常用指令

指令用途
nginx启动Nginx服务
nginx -s reload重新加载Nginx配置
nginx -s stop停止Nginx服务
nginx -t测试Nginx配置文件是否正确
nginx -v显示Nginx版本信息
nginx -V显示Nginx版本和编译参数信息
nginx -c [配置文件路径]使用指定的配置文件启动Nginx服务

配置文件

shell
# ============================================
# 全局块(main) - 影响 Nginx 服务器整体的运行
# ============================================

# 指定运行 Nginx 的工作进程数。
# auto 表示自动检测 CPU 核心数,通常设置为等于 CPU 核心数(例如 4 核设置为 4)。
# 作用:充分利用 CPU 多核处理能力,提高并发性能。
worker_processes auto;

# 绑定工作进程到特定的 CPU 上,避免进程在 CPU 间切换带来的性能损耗。
# 作用:优化 CPU 缓存命中率,提升性能(高级调优,通常保持注释)。
# worker_cpu_affinity auto;

# 指定 Nginx 主进程的 PID(进程 ID)存放路径。
# 作用:系统通过这个文件找到 Nginx 进程并进行管理(如重启、停止)。
pid /run/nginx.pid;

# 指定错误日志的级别和存放路径。
# 日志级别可选:debug | info | notice | warn | error | crit | alert | emerg。
# 作用:记录服务器运行中的问题,级别越低(如 debug)记录越详细,生产环境建议 warn 或 error。
error_log /var/log/nginx/error.log warn;

# 加载额外的配置文件,通常用于引入模块或包含其他站点的配置。
# 作用:实现模块化配置,便于管理多个网站或应用。
include /etc/nginx/modules-enabled/*.conf;


# ============================================
# 事件块(events) - 主要影响网络连接的处理
# ============================================
events {
    # 设置单个工作进程可以同时打开的最大连接数。
    # 作用:决定了 Nginx 的总体最大并发数(max_clients = worker_processes * worker_connections)。
    # 注意:受限于系统文件描述符的限制(可通过 ulimit -n 查看)。
    worker_connections 1024;

    # 告诉 Nginx 一次性地接受所有新连接,而不是一个一个地接受。
    # 作用:在高并发场景下减少系统中断次数,提高连接建立的效率。
    multi_accept on;

    # 指定使用哪种事件驱动模型。
    # 通常 Linux 系统推荐使用 epoll(高效),Nginx 会自动选择最优方式,一般无需显式设置。
    # use epoll;
}


# ============================================
# HTTP 块(http) - 核心配置,处理 Web 服务的通用规则
# ============================================
http {

    # ========== 基础设置 ==========
    # 引入 MIME 类型文件。MIME 类型告诉浏览器如何处理不同类型的文件(如 text/html, image/jpeg)。
    # 作用:确保浏览器能正确解析和渲染文件,而不是直接下载。
    include /etc/nginx/mime.types;

    # 定义默认的 MIME 类型,当文件后缀无法匹配时使用。
    # 作用:防止未知文件类型被当作文本直接输出,提高安全性。
    default_type application/octet-stream;

    # 定义日志格式(log_format),用于 access_log。
    # main 是这种格式的名称,可以在后续的 access_log 指令中引用。
    # 作用:记录客户端的访问信息,便于分析流量、排查问题。
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # 指定访问日志的存放路径,并使用上面定义的 main 格式进行记录。
    # 作用:记录所有客户端对 Nginx 的访问情况。
    access_log /var/log/nginx/access.log main;

    # 启用高效文件传输模式。
    # 作用:让内核直接在文件系统和网络 socket 之间传输数据,避免数据在内核空间和用户空间之间拷贝,提高大文件传输性能。
    sendfile on;

    # 在 sendfile 开启的情况下,优化数据包的发送。
    # 作用:尽量在一个数据包中发送完整的响应头和数据,减少网络传输次数(通常用于大文件下载)。
    tcp_nopush on;

    # 禁用 Nagle 算法(一种减少小数据包数量的算法)。
    # 作用:对于需要实时响应的应用(如 API、小图片),立即发送数据包,减少延迟。
    tcp_nodelay on;

    # ========== 连接与超时设置 ==========
    # 保持连接的超时时间(秒)。客户端在这个时间内可以复用同一个 TCP 连接发送多个请求。
    # 作用:减少建立 TCP 连接的三次握手开销,提高性能。数值不宜过大,避免占用过多连接资源。
    keepalive_timeout 65;

    # 客户端请求头的超时时间。
    # 作用:如果客户端在这个时间内没有发送完整的请求头,Nginx 将返回 408 错误。
    client_header_timeout 60;

    # 客户端请求体的超时时间。
    # 作用:如果两次读取操作间隔超过这个时间,Nginx 将中断连接。
    client_body_timeout 60;

    # ========== 文件缓存设置 ==========
    # 设置存储有关打开文件信息的缓存(如文件名、文件大小、修改时间等)。
    # max: 缓存最大元素数量; inactive: 如果文件在 60 秒内未被访问,则从缓存中删除。
    # 作用:减少系统调用(open, stat),提高访问静态文件的性能。
    open_file_cache max=1000 inactive=60s;

    # 在 open_file_cache 中,检查缓存元素有效性的时间间隔。
    open_file_cache_valid 60s;

    # 在 inactive 指定的时间内,文件被访问的最少次数,少于这个次数则从缓存中移除。
    open_file_cache_min_uses 2;

    # 是否在查找文件出错时(如找不到文件)也缓存错误信息。
    open_file_cache_errors on;

    # ========== Gzip 压缩设置 ==========
    # 启用 Gzip 压缩。
    # 作用:对响应内容进行压缩,减少传输体积,加快页面加载速度,节省带宽。
    gzip on;

    # 设置进行压缩的最小文件大小(小于此值的不压缩,因为压缩效果不明显且浪费 CPU)。
    gzip_min_length 1k;

    # 设置压缩级别(1-9),1 速度最快压缩比最低,9 速度最慢压缩比最高。
    # 建议 4-6 之间平衡 CPU 和带宽。
    gzip_comp_level 6;

    # 指定对哪些 MIME 类型的响应进行压缩。
    gzip_types text/plain text/css text/xml application/javascript application/json application/xml+rss application/atom+xtext image/svg+xml;

    # 是否在响应头中添加 "Vary: Accept-Encoding",告诉缓存服务器根据编码类型缓存不同版本。
    gzip_vary on;

    # 禁用对某些老旧的浏览器(如 IE6)进行压缩,避免兼容性问题。
    gzip_disable "msie6";

    # ========== 负载均衡配置 ==========
    # 定义一个上游服务器组(后端服务器集群),用于负载均衡。
    # 作用:将请求分发到多台后端服务器,提高系统可用性和处理能力。
    upstream backend_servers {
        # 负载均衡策略:默认是轮询(round-robin)。
        # 其他策略:ip_hash(根据 IP 保持会话)、least_conn(最少连接数)。
        
        # 定义后端服务器地址。可以带权重(weight),weight 越大分配的请求越多。
        server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
        server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:8080 backup;  # 标记为备份服务器,当主服务器全部不可用时启用
    }

    # ========== 虚拟主机(Server 块)配置 ==========
    # 一个 http 块中可以包含多个 server 块,每个 server 块代表一个虚拟主机(站点)。
    
    # 第一个 Server 块:重定向 HTTP 到 HTTPS(强制加密)
    server {
        # 监听 80 端口(默认 HTTP 端口)。
        listen 80;
        # 监听 IPv6 的 80 端口。
        listen [::]:80;

        # 定义该虚拟主机的域名。可以写多个,用空格分隔。
        server_name example.com www.example.com;

        # 将所有 HTTP 请求重定向到 HTTPS 版本。
        # 作用:强制全站加密,提高安全性。
        return 301 https://$server_name$request_uri;
    }

    # 第二个 Server 块:处理 HTTPS 请求(主要站点)
    server {
        # 监听 443 端口(默认 HTTPS 端口),并启用 SSL。
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        # 定义站点域名。
        server_name example.com www.example.com;

        # ========== SSL/TLS 证书配置 ==========
        # 指定 SSL 证书文件的路径(公钥)。
        # 作用:用于向客户端证明服务器的身份,并建立加密通道。
        ssl_certificate /etc/nginx/ssl/example.com.crt;

        # 指定 SSL 证书密钥文件的路径(私钥)。
        # 作用:服务器端解密数据使用,需妥善保管。
        ssl_certificate_key /etc/nginx/ssl/example.com.key;

        # SSL 会话缓存,用于复用 SSL 会话,减少握手开销。
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        # ========== 网站根目录与默认文件 ==========
        # 定义网站文件的根目录。
        # 作用:告诉 Nginx 到哪里寻找请求的文件。
        root /var/www/example.com/html;

        # 定义默认首页文件(目录索引文件),按顺序查找。
        # 作用:当访问域名(如 example.com/)时,自动返回 index.html 或 index.htm。
        index index.html index.htm;

        # ========== 请求处理规则(location 块) ==========
        
        # 根路径匹配(/)
        location / {
            # 尝试按照顺序查找文件:
            # $uri 直接查找文件;
            # $uri/ 将请求作为目录处理,尝试查找目录下的索引文件(由 index 指令定义);
            # 如果都找不到,则返回 404。
            # 作用:优雅地处理静态文件请求。
            try_files $uri $uri/ =404;
        }

        # 处理 PHP 动态请求(将请求代理到 PHP-FPM)
        location ~ \.php$ {
            # 包含 FastCGI 的常用参数配置。
            include fastcgi_params;

            # 设置 FastCGI 请求的脚本路径。
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            # 将 PHP 请求转发到 PHP-FPM 监听的地址(unix socket 或 tcp 端口)。
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
            # fastcgi_pass 127.0.0.1:9000;

            # 设置 FastCGI 超时时间。
            fastcgi_read_timeout 300;
        }

        # 处理图片等静态文件,设置浏览器缓存过期时间
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
            # 作用:对于不常变化的静态资源,设置较长的缓存时间,减少请求量,加快重复访问速度。
            expires 30d;

            # 关闭访问日志,因为静态文件请求量大,记录日志会浪费磁盘 IO。
            access_log off;

            # 增加响应头,标记文件类型,提高安全性。
            add_header Cache-Control "public, immutable";
        }

        # 禁止访问隐藏文件(以 . 开头的文件,如 .htaccess, .git)
        location ~ /\. {
            # 作用:防止敏感配置文件被外部直接访问,增强安全性。
            deny all;
            access_log off;
            log_not_found off;
        }

        # ========== 错误页面配置 ==========
        # 自定义错误页面。
        # 作用:当发生指定 HTTP 错误时,显示自定义的友好页面,而不是 Nginx 的默认错误页。
        error_page 404 /404.html;
        location = /404.html {
            # 内部重定向到 404 页面时,使用站点根目录下的 404.html。
            root /var/www/example.com/html;
            internal;  # 表示这个 location 只能被内部重定向访问,外部不能直接访问这个 URL
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /var/www/example.com/html;
            internal;
        }

        # ========== 代理配置示例 ==========
        # 将以 /api/ 开头的请求反向代理到后端服务器
        location /api/ {
            # 将请求转发到上面定义的 upstream 组(backend_servers)进行负载均衡。
            proxy_pass http://backend_servers;

            # 设置代理请求头,将客户端的原始信息传递给后端服务器。
            proxy_set_header Host $host;                      # 传递原始 Host 头
            proxy_set_header X-Real-IP $remote_addr;          # 传递客户端真实 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递完整的 IP 链
            proxy_set_header X-Forwarded-Proto $scheme;       # 传递原始协议(http 或 https)

            # 代理超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;

            # 启用缓冲,提高性能
            proxy_buffering on;
            proxy_buffer_size 4k;
            proxy_buffers 8 4k;
            proxy_busy_buffers_size 8k;

            # 禁用重定向(如果需要后端返回重定向时进行修改,可以开启)
            # proxy_redirect off;
        }

        # ========== 访问控制示例 ==========
        # 限制对 admin 目录的访问,仅允许特定 IP
        location /admin/ {
            # 允许的 IP 地址
            allow 192.168.1.0/24;
            allow 10.0.0.1;
            # 拒绝所有其他 IP
            deny all;

            # 如果通过访问控制,则代理到后端应用
            proxy_pass http://backend_servers/admin/;
        }

        # ========== 速率限制示例 ==========
        # 在 http 块中通常会定义限制区域(这里仅为示例,实际应放在 http 块内)
        # limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
        
        # 对登录接口应用速率限制
        location /login.html {
            # 引用名为 login_limit 的限制区域,每秒允许 1 个请求,突发不超过 5 个。
            # limit_req zone=login_limit burst=5 nodelay;
            
            # 处理登录的逻辑...
            root /var/www/example.com/html;
        }
    }

    # 可以在这里继续添加其他 server 块,用于不同的域名或端口
    # server {
    #     listen 80;
    #     server_name another-domain.com;
    #     root /var/www/another-domain;
    #     ...
    # }
}

# ============================================
# Mail 块(可选)- 用于配置邮件代理(如 IMAP、POP3 代理)
# ============================================
#mail {
#    # See sample authentication script at:
#    # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#    # auth_http localhost/auth.php;
#    # pop3_capabilities "TOP" "USER";
#    # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#    server {
#        listen     localhost:110;
#        protocol   pop3;
#        proxy      on;
#    }
# 
#    server {
#        listen     localhost:143;
#        protocol   imap;
#        proxy      on;
#    }
#}