Nginx(发音"engine-x")是一款高性能的HTTP和反向代理Web服务器,也是目前最流行的Web服务器之一。它以高性能、高并发、低资源消耗、稳定性好著称,被广泛应用于各大互联网公司和个人网站。
根据Netcraft的统计,Nginx已经超越Apache,成为全球使用量最大的Web服务器。无论是腾讯、阿里、百度这样的大厂,还是个人博客、小型网站,都能看到Nginx的身影。作为一名程序员和站长,掌握Nginx是必备的技能之一。
今天就来分享Nginx高性能Web服务器的完全指南,从基础概念、安装配置、核心功能、性能优化、安全加固等多个方面,全面讲解Nginx。
Nginx简介
1. 什么是Nginx:
Nginx是由俄罗斯程序员Igor Sysoev(伊戈尔·赛索耶夫)开发的一款高性能Web服务器,第一个公开版本发布于2004年。Nginx最初是为了解决C10K问题(同时处理10000个并发连接)而设计的,采用了事件驱动、异步非阻塞的架构,能够在有限的硬件资源下处理大量的并发连接。
Nginx不仅仅是一个Web服务器,它还是一个:
- HTTP服务器:提供静态文件服务、HTTP缓存、Gzip压缩等
- 反向代理服务器:将请求转发给后端服务器,实现负载均衡、缓存、SSL终止等
- 邮件代理服务器:支持IMAP/POP3/SMTP代理
- TCP/UDP代理服务器:支持四层协议的负载均衡
Nginx的特点:
- 高性能:事件驱动、异步非阻塞架构,能够处理大量并发连接,单机可支持数十万并发
- 低资源消耗:内存占用小,CPU利用率高,在相同硬件下比Apache能处理更多请求
- 高稳定性:模块化设计,稳定性好,能够长时间运行不宕机
- 热部署:支持平滑升级、平滑重启,不中断服务
- 功能丰富:支持反向代理、负载均衡、缓存、Gzip、SSL、虚拟主机、URL重写等丰富功能
- 模块化:高度模块化的设计,有丰富的第三方模块,可扩展性强
- 跨平台:支持Linux、Windows、macOS等多种操作系统
- 开源免费:Nginx是开源软件,基于BSD协议,可以免费使用和修改
2. Nginx vs Apache:
Nginx和Apache是最流行的两款Web服务器,它们各有特点:
| 特性 | Nginx | Apache |
|---|---|---|
| 架构 | 事件驱动、异步非阻塞 | 进程/线程驱动、同步阻塞 |
| 并发处理 | 高并发,单机支持数十万连接 | 并发能力有限,受进程/线程数限制 |
| 内存占用 | 低 | 较高 |
| 静态文件 | 性能优异 | 性能一般 |
| 动态请求 | 通过反向代理处理 | 可直接处理(通过模块) |
| 配置 | 简洁灵活 | 相对复杂 |
| 模块 | 模块化,需编译时选择 | 动态加载模块,更灵活 |
| .htaccess | 不支持 | 支持 |
| 热部署 | 支持 | 不支持(需重启) |
简单来说,Nginx在性能、并发、资源消耗方面优于Apache,适合高并发、高性能的场景;Apache在功能丰富度、动态模块、.htaccess支持方面有优势,适合需要灵活配置的场景。
目前的趋势是使用Nginx作为前端反向代理和静态文件服务器,Apache作为后端处理动态请求,两者结合发挥各自的优势。当然,越来越多的网站完全使用Nginx,通过PHP-FPM等方式处理动态请求,性能更好。
3. Nginx的版本:
- Nginx开源版(Nginx Open Source):免费开源,功能足够大多数场景使用
- Nginx Plus:商业版,提供更多企业级功能(如主动健康检查、会话保持、动态配置、技术支持等),收费
- Tengine:淘宝基于Nginx开发的定制版,增加了很多高级功能和优化,开源免费,国内很多公司使用
- OpenResty:基于Nginx的Web平台,集成了LuaJIT和大量Lua库,支持用Lua脚本扩展Nginx功能,适合开发高性能Web应用
对于大多数个人和小型网站,Nginx开源版就足够了。如果需要更高级的功能,可以考虑Tengine或OpenResty。
Nginx安装
1. Linux安装:
在Linux上安装Nginx有多种方式:
方式一:包管理器安装(推荐新手):
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install nginx
# CentOS/RHEL
sudo yum install epel-release
sudo yum install nginx
# 启动Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 查看状态
sudo systemctl status nginx包管理器安装的优点是简单方便,自动处理依赖,缺点是版本可能较旧。
方式二:源码编译安装(推荐进阶用户):
# 安装依赖
sudo yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载源码
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
# 配置编译选项
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre
# 编译安装
make
sudo make install
# 启动
/usr/local/nginx/sbin/nginx源码编译的优点是可以选择版本、自定义模块和功能,缺点是需要手动处理依赖和升级。
2. Windows安装:
在Windows上,直接从Nginx官网下载Windows版本的压缩包,解压后运行nginx.exe即可。不过Nginx在Windows上的性能不如Linux,通常只用于开发测试,不推荐生产环境使用。
3. 验证安装:
安装完成后,在浏览器中访问服务器IP地址,如果看到Nginx的欢迎页面,说明安装成功。
# 查看Nginx版本
nginx -v
# 查看编译配置
nginx -V
# 测试配置文件语法
nginx -t
# 平滑重启(重新加载配置)
nginx -s reload
# 快速停止
nginx -s stop
# 优雅停止(处理完当前请求后停止)
nginx -s quit
# 重新打开日志文件
nginx -s reopenNginx配置文件
Nginx的配置文件通常是nginx.conf,结构清晰,由指令和块组成。
1. 配置文件结构:
# 全局块:配置影响Nginx全局的指令
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# events块:配置影响Nginx服务器与用户的网络连接
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
# http块:配置HTTP服务器的主要参数
http {
# http全局配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
# server块:配置虚拟主机
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm;
# location块:配置请求路由
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
# 可以有多个server块
# include /etc/nginx/conf.d/*.conf;
}配置文件的层级结构:全局块 → events块 → http块 → server块 → location块,内层块会继承外层块的配置,也可以覆盖。
2. 常用全局配置:
# 运行用户
user nginx;
# worker进程数,建议设置为CPU核心数
worker_processes auto;
# 错误日志路径和级别
error_log /var/log/nginx/error.log warn;
# PID文件路径
pid /var/run/nginx.pid;
# worker进程最大打开文件数
worker_rlimit_nofile 65535;3. events块配置:
events {
# 每个worker进程的最大连接数
worker_connections 10240;
# 使用epoll事件模型(Linux推荐)
use epoll;
# 允许同时接受多个新连接
multi_accept on;
}最大并发数 = workerprocesses × workerconnections。
4. http块常用配置:
http {
# 文件扩展名与MIME类型映射
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
access_log /var/log/nginx/access.log main;
# 高效文件传输
sendfile on;
# 减少网络报文数量
tcp_nopush on;
# 禁用Nagle算法,降低延迟
tcp_nodelay on;
# 连接超时时间
keepalive_timeout 65;
keepalive_requests 100;
# 发送超时
send_timeout 10;
# 客户端请求体大小限制
client_max_body_size 20m;
client_body_buffer_size 128k;
# 客户端请求头大小限制
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
# Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml application/javascript application/json;
gzip_vary on;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.";
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}核心功能配置
1. 虚拟主机:
虚拟主机允许在一台服务器上运行多个网站,通过server_name区分。
# 基于域名的虚拟主机
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
server {
listen 80;
server_name another.com;
root /var/www/another;
index index.html;
}
# 默认虚拟主机(没有匹配的server_name时使用)
server {
listen 80 default_server;
server_name _;
return 444; # 直接关闭连接
}2. 静态文件服务:
Nginx处理静态文件的性能非常好,是静态文件服务的首选。
server {
listen 80;
server_name static.example.com;
root /var/www/static;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
# 防盗链
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
# 目录列表(不建议开启)
# autoindex on;
# autoindex_exact_size off;
# autoindex_localtime on;
}3. 反向代理:
反向代理是Nginx最常用的功能之一,将请求转发给后端服务器。
server {
listen 80;
server_name app.example.com;
location / {
# 后端服务器地址
proxy_pass http://127.0.0.1:8080;
# 传递请求头
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_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 跟随重定向
# proxy_redirect off;
}
# WebSocket支持
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}4. 负载均衡:
Nginx可以作为负载均衡器,将请求分发到多个后端服务器,提高系统的可用性和性能。
# 定义上游服务器组
upstream backend {
# 轮询(默认)
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
# 权重(weight),值越大分配的请求越多
# server 192.168.1.10:8080 weight=3;
# server 192.168.1.11:8080 weight=2;
# server 192.168.1.12:8080 weight=1;
# ip_hash:根据客户端IP分配,保证同一用户始终访问同一后端(会话保持)
# ip_hash;
# least_conn:分配给连接数最少的后端
# least_conn;
# 故障转移:max_fails失败次数,fail_timeout失败后暂停时间
# server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
# 备份服务器:其他服务器都不可用时使用
# server 192.168.1.13:8080 backup;
# 永久不可用
# server 192.168.1.14:8080 down;
# keepalive:保持连接数,提高性能
keepalive 32;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# keepalive需要设置
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}Nginx支持的负载均衡算法:
- 轮询(round-robin):默认,按顺序分配
- 权重(weight):按权重比例分配
- ip_hash:按客户端IP哈希分配,会话保持
- least_conn:分配给连接数最少的
- fair:按响应时间分配(第三方模块)
- url_hash:按URL哈希分配(第三方模块)
5. URL重写(rewrite):
rewrite模块支持URL重写,实现伪静态、重定向等功能。
server {
listen 80;
server_name example.com;
# 伪静态:将/article/123重写为index.php?id=123
location / {
rewrite ^/article/(\d+)$ /index.php?id=$1 last;
}
# 301永久重定向:将旧域名重定向到新域名
server {
listen 80;
server_name old.com;
return 301 http://new.com$request_uri;
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
# www重定向到非www
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
# rewrite指令语法:rewrite regex replacement [flag];
# flag可选值:
# last:停止后续rewrite,重新匹配location
# break:停止后续rewrite,继续当前location处理
# redirect:302临时重定向
# permanent:301永久重定向
}6. HTTPS/SSL配置:
配置HTTPS,启用SSL/TLS加密。
server {
listen 443 ssl http2;
server_name example.com;
# 证书文件
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSL协议版本
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP重定向到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}7. PHP-FPM配置:
Nginx通过FastCGI协议与PHP-FPM通信,处理PHP请求。
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
# 安全:禁止访问不存在的PHP文件
try_files $uri =404;
# PHP-FPM地址(TCP或Unix Socket)
fastcgi_pass 127.0.0.1:9000;
# fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
# 包含FastCGI参数
include fastcgi_params;
# 重要:设置SCRIPT_FILENAME
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 超时设置
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
# 缓冲区
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
# 隐藏PHP版本
# fastcgi_hide_header X-Powered-By;
}
# 禁止访问敏感文件
location ~ /\.(ht|git|svn) {
deny all;
}
}性能优化
1. 系统层面优化:
# 文件描述符限制(/etc/security/limits.conf)
* soft nofile 65535
* hard nofile 65535
# 内核参数优化(/etc/sysctl.conf)
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 0
# 生效
sysctl -p2. Nginx配置优化:
# worker进程数 = CPU核心数
worker_processes auto;
# 绑定CPU(可选,减少上下文切换)
# worker_cpu_affinity 0001 0010 0100 1000;
# 最大打开文件数
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# 客户端缓冲区
client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
# 代理缓冲区
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# Gzip压缩
gzip on;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 静态文件缓存(在location中配置)
# expires 30d;
# add_header Cache-Control "public, immutable";
# 日志缓冲
access_log /var/log/nginx/access.log main buffer=64k flush=5m;
}3. 静态资源优化:
- 开启Gzip/Brotli压缩
- 设置合适的缓存头(Expires、Cache-Control)
- 使用CDN加速静态资源
- 图片优化(压缩、WebP格式、懒加载)
- 合并CSS/JS文件,减少请求数
- 开启sendfile,提高文件传输效率
4. 代理缓存:
Nginx可以缓存后端响应,减少后端压力。
# 定义缓存区
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
}
}安全加固
1. 基本安全:
# 隐藏Nginx版本号
server_tokens off;
# 禁止访问敏感文件
location ~ /\.(ht|git|svn|env) {
deny all;
access_log off;
log_not_found off;
}
# 禁止访问备份文件
location ~ ~$ {
deny all;
}
# 限制请求方法
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405;
}
# 防止图片盗链
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}2. 限速:
# 限制请求频率
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 限制连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
# 每秒最多10个请求,突发20个
limit_req zone=req_limit burst=20 nodelay;
# 每个IP最多10个连接
limit_conn conn_limit 10;
}
}3. HTTPS安全:
- 使用TLS 1.2/1.3,禁用旧协议
- 使用强加密套件
- 开启HSTS
- 配置OCSP Stapling
- 证书自动续期(Let's Encrypt + certbot)
4. 其他安全建议:
- 定期更新Nginx版本
- 使用防火墙(iptables/firewalld)限制访问
- 配置WAF(Web应用防火墙),如ModSecurity
- 定期检查日志,发现异常访问
- 后端服务不直接暴露公网,只通过Nginx代理
- 配置合适的超时,防止慢连接攻击
常用运维命令
# 启动
nginx
# 停止
nginx -s stop # 快速停止
nginx -s quit # 优雅停止
# 重新加载配置(平滑重启)
nginx -s reload
# 重新打开日志文件(日志切割时使用)
nginx -s reopen
# 测试配置文件语法
nginx -t
nginx -T # 测试并打印完整配置
# 查看版本
nginx -v
nginx -V # 查看编译参数
# 查看进程
ps aux | grep nginx
# 查看连接数
netstat -an | grep :80 | wc -l
# 实时查看访问日志
tail -f /var/log/nginx/access.log
# 查看错误日志
tail -f /var/log/nginx/error.log常见问题排查
1. 502 Bad Gateway:
- 后端服务(PHP-FPM/Node.js等)没有启动或崩溃
- 后端服务地址或端口配置错误
- 后端服务响应超时
- 解决:检查后端服务状态、检查proxypass/fastcgipass配置、增加超时时间
2. 504 Gateway Timeout:
- 后端服务响应时间过长
- 解决:优化后端性能、增加proxyreadtimeout/fastcgireadtimeout
3. 403 Forbidden:
- 文件权限不正确
- 目录没有index文件且autoindex关闭
- 配置了deny规则
- 解决:检查文件权限、检查index配置、检查deny规则
4. 404 Not Found:
- 文件不存在
- root/alias配置错误
- rewrite规则错误
- 解决:检查文件是否存在、检查root配置、检查rewrite规则
5. 静态文件不缓存:
- 没有配置expires或Cache-Control
- 解决:在location中添加expires和Cache-Control头
6. Gzip不生效:
- 没有开启gzip
- gzip_types没有包含对应MIME类型
- 响应内容太小(小于gzipminlength)
- 解决:检查gzip配置、检查gzip_types、检查Content-Type
总结
Nginx是一款非常优秀的Web服务器,以高性能、高并发、低资源消耗著称,是目前最流行的Web服务器之一。掌握Nginx,能够帮助我们搭建高性能、高可用、安全的网站和服务。
本文从Nginx的基础概念、安装、配置文件结构、核心功能(虚拟主机、静态文件、反向代理、负载均衡、URL重写、HTTPS、PHP-FPM)、性能优化、安全加固、运维命令、常见问题排查等方面,全面讲解了Nginx。希望这篇指南能够帮助大家更好地理解和使用Nginx。
当然,Nginx的功能非常丰富,本文只是介绍了最常用的部分。在实际使用中,还需要根据具体的场景和需求,深入学习和实践。Nginx的官方文档是最好的学习资料,遇到问题时多查文档、多测试,逐步积累经验。
作为一名程序员和站长,Nginx是我们必须掌握的工具之一。它不仅仅是一个Web服务器,更是我们构建高性能Web服务的基石。希望大家都能掌握Nginx,搭建出高性能、高可用、安全的网站和服务。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录