Nginx(发音"engine x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它由俄罗斯的Igor Sysoev开发,第一个公开版本发布于2004年。
Nginx以高性能、高并发、低资源消耗著称,它采用事件驱动的异步非阻塞架构,能在有限的硬件资源下支持大量的并发连接。相比传统的Apache(每个连接一个进程/线程),Nginx在高并发场景下性能优势明显,内存和CPU消耗也更低。
现在,Nginx已经成为最流行的Web服务器之一。根据Netcraft的统计,全球有超过30%的网站使用Nginx。国内的互联网公司,如百度、阿里、腾讯、京东、新浪等,都在大量使用Nginx。
Nginx的主要用途:
- Web服务器:托管静态网站、PHP/Python/Node.js等动态网站
- 反向代理:把请求转发给后端的应用服务器
- 负载均衡:把请求分发到多台后端服务器,提高并发和可用性
- 缓存:缓存静态文件和动态页面,减轻后端压力
- 安全防护:限流、防DDoS、HTTPS加密、访问控制
今天分享Nginx的实战配置,重点讲反向代理和负载均衡,以及其他常用配置。
安装Nginx
Nginx的安装很简单。
Ubuntu/Debian:
sudo apt-get update
sudo apt-get install nginxCentOS/RHEL:
sudo yum install epel-release
sudo yum install nginx编译安装(推荐生产环境):
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar zxf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
make && sudo make install编译安装可以选择需要的模块,更灵活,性能也更好。推荐生产环境用编译安装。
安装完成后,启动Nginx:
sudo /usr/local/nginx/sbin/nginx常用命令:
nginx -s reload # 重新加载配置
nginx -s stop # 快速停止
nginx -s quit # 优雅停止
nginx -t # 测试配置文件
nginx -v # 查看版本
nginx -V # 查看版本和编译参数基本配置
Nginx的配置文件是nginx.conf,通常在安装目录的conf目录下。一个基本的配置:
user www www;
worker_processes auto;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include 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 logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_max_body_size 20m;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
}关键配置说明:
- worker_processes:工作进程数,建议设为CPU核心数(auto自动检测)
- worker_connections:每个工作进程的最大连接数
- use epoll:使用epoll事件模型(Linux下高效)
- sendfile:开启高效文件传输
- keepalive_timeout:长连接超时时间
- clientmaxbody_size:客户端请求体最大大小(影响文件上传)
- gzip:开启Gzip压缩
反向代理
反向代理是Nginx最常用的功能之一。反向代理的意思是:Nginx接收客户端的请求,然后把请求转发给后端的应用服务器(如Tomcat、Node.js、PHP-FPM等),后端服务器处理完请求后,把响应返回给Nginx,Nginx再返回给客户端。
反向代理的好处:
- 隐藏后端服务器,提高安全性
- 统一入口,方便做负载均衡、缓存、限流等
- 处理静态文件,减轻后端压力
- 支持HTTPS加密,后端不需要处理SSL
基本反向代理配置:
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 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}关键配置说明:
- proxy_pass:后端服务器地址
- proxysetheader:设置转发给后端的请求头
- Host:原始域名(后端需要知道原始域名) - X-Real-IP:客户端真实IP - X-Forwarded-For:代理链路 - X-Forwarded-Proto:原始协议(http/https)
- proxyconnecttimeout:连接后端超时
- proxyreadtimeout:读取后端响应超时
- proxysendtimeout:发送请求到后端超时
- proxy_buffering:开启响应缓冲
WebSocket反向代理:
如果后端是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_read_timeout 86400;
}负载均衡
当单台后端服务器无法满足并发需求时,可以用Nginx做负载均衡,把请求分发到多台后端服务器,提高并发处理能力和可用性。
Nginx的负载均衡配置:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
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;
}
}负载均衡策略:
- 轮询(默认):按顺序把请求分发到每台后端服务器,适合后端服务器性能相近的场景。
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}- 加权轮询:根据服务器性能设置权重,性能好的服务器分配更多请求。
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
}- ip_hash:根据客户端IP的hash结果分配,同一个IP的请求总是分到同一台后端服务器,适合需要会话保持的场景。
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}- least_conn:把请求分给当前连接数最少的后端服务器,适合请求处理时间差异大的场景。
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}- fair(第三方模块):根据后端服务器的响应时间分配,响应快的优先。需要安装nginx-upstream-fair模块。
upstream backend {
fair;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}健康检查:
Nginx内置了被动健康检查,如果某台后端服务器失败次数达到阈值,会暂时把它标记为不可用,不再分发请求。
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
}- max_fails:最大失败次数,达到后标记为不可用
- fail_timeout:不可用持续时间,过后重新尝试
- backup:备用服务器,只有其他服务器都不可用时才使用
主动健康检查需要安装nginxupstreamcheck_module模块。
静态文件缓存
Nginx处理静态文件的性能非常好,可以配置缓存,减轻后端压力。
# 静态文件缓存
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 ~* \.(html|htm)$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
}- expires:设置缓存过期时间
- Cache-Control:缓存控制头
- access_log off:关闭静态文件的访问日志,减少IO
HTTPS配置
现在HTTPS已经是标配,Nginx配置HTTPS很简单:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
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 https;
}
}
# HTTP跳转到HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}免费的SSL证书可以用Let's Encrypt,通过certbot工具自动申请和续期。
安全加固
Nginx的安全加固配置:
# 隐藏Nginx版本号
server_tokens off;
# 限制请求体大小
client_max_body_size 10m;
# 限流
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
# 应用限流
location / {
limit_req zone=one burst=20 nodelay;
}
# 禁止访问敏感文件
location ~ /\.(ht|git|svn) {
deny all;
}
# 禁止访问配置文件
location ~* \.(env|ini|conf|log|sh)$ {
deny all;
}
# 防盗链
location ~* \.(jpg|jpeg|png|gif|ico)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
}总结
Nginx是一个强大的Web服务器和反向代理服务器,掌握它的配置,能帮你搭建高性能、高可用的Web服务。
重点掌握:
- 基本配置:worker进程、连接数、Gzip、超时
- 反向代理:proxy_pass、请求头设置、超时配置
- 负载均衡:upstream、轮询/加权/iphash/leastconn、健康检查
- 静态缓存:expires、Cache-Control
- HTTPS:SSL证书配置、HSTS、HTTP跳转
- 安全加固:隐藏版本号、限流、禁止敏感文件、防盗链
Nginx的配置很灵活,功能也很强大,需要在实践中不断学习和积累。希望这篇文章能帮你入门Nginx的实战配置。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录