作为一名长期奋战在运维一线的工程师,我深知 Nginx 在生产环境中的重要性。今天我将分享一些 Nginx 的高级配置技巧,这些都是在实际工作中经过验证的实用方案。
Nginx 不仅仅是一个简单的 Web 服务器,它强大的模块系统和灵活的配置使其成为现代架构中不可或缺的组件。本文将深入探讨访问控制、限流策略、代理配置等核心功能,帮助你构建更安全、更稳定的服务架构。
ngx_http_auth_basic_module 模块提供了最简单的访问控制方式。虽然功能基础,但在某些场景下非常实用:
nginx复制location /secure/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/htpasswd;
}
密码文件生成方法:
bash复制# 安装工具
yum install httpd-tools -y
# 创建密码文件并添加用户
htpasswd -c /etc/nginx/htpasswd user1
# 添加更多用户
htpasswd /etc/nginx/htpasswd user2
注意:密码文件应存放在非Web目录下,并设置严格的权限(建议600)
实际项目中,我们往往需要集成现有的认证系统。ngx_http_auth_request_module 模块完美解决了这个问题:
nginx复制location / {
auth_request /auth;
error_page 403 = @login;
}
location = /auth {
internal;
proxy_pass http://auth-service/check;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location @login {
return 302 https://login.example.com?return=$scheme://$http_host$request_uri;
}
这种架构的优势在于:
ngx_http_secure_link_module 可以创建有时效性的访问链接,常用于文件下载、临时资源访问等场景:
nginx复制location /download/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri secret_key";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
链接生成示例(Python):
python复制import hashlib
import base64
import time
def generate_secure_link(path, secret, expire_seconds):
expires = str(int(time.time()) + expire_seconds)
hashable = f"{expires}{path} {secret}"
md5 = hashlib.md5(hashable.encode()).digest()
token = base64.urlsafe_b64encode(md5).decode().rstrip('=')
return f"/download/{path}?md5={token}&expires={expires}"
nginx复制limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://api_backend;
}
}
nginx复制limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
limit_conn conn_limit 3;
limit_rate 500k;
}
}
实战经验:建议将限流配置放在单独的配置文件中,便于统一管理和调整
nginx复制proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx复制upstream backend {
least_conn;
server backend1.example.com weight=5;
server backend2.example.com;
server backup.example.com backup;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
负载均衡策略选择建议:
nginx复制proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 8k;
proxy_busy_buffers_size 16k;
proxy_temp_file_write_size 16k;
proxy_temp_path /var/nginx/proxy_temp;
nginx复制log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'upstream:$upstream_addr '
'rt:$request_time uct:$upstream_connect_time '
'urt:$upstream_response_time';
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
502 Bad Gateway
连接数不足
性能瓶颈
nginx复制server_tokens off;
nginx复制add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
nginx复制ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
在实际部署中,我通常会将这些配置整理成可复用的模板,根据具体业务需求进行调整。Nginx的强大之处在于它的灵活性,但这也意味着需要更深入的理解才能发挥其全部潜力。