TIP
高性能、高稳定性、轻量级开源网页服务器,广泛用作反向代理、负载均衡器和HTTP缓存。
yum install nginx
nginx -v 验证
配置文件路径
| 路径 | 用途 |
|---|---|
/etc/logrotate.d/nginx | Nginx日志轮转配置 |
/etc/nginx/ | Nginx配置文件目录 |
/etc/nginx/nginx.conf | Nginx主配置文件,实际使用的文件 |
/etc/nginx/nginx.conf.default | Nginx默认主配置文件,用于备份被覆盖 |
/etc/nginx/conf.d/ | Nginx虚拟主机配置目录 |
/etc/nginx/conf.d/default.conf | Nginx默认虚拟主机配置文件 |
/etc/nginx/mime.types | Nginx 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;
# }
#}