高级Nginx应用场景和配置技巧
文章目录
- 高级Nginx应用场景和配置技巧
- [1. 配置参数最佳实践](#1. 配置参数最佳实践)
- [2. Nginx配置示例](#2. Nginx配置示例)
- [3. 常见场景](#3. 常见场景)
-
- [1. 静态文件服务](#1. 静态文件服务)
- [2. 动态内容代理](#2. 动态内容代理)
- [3. SSL加密](#3. SSL加密)
- [4. URL重写](#4. URL重写)
- [5. 访问控制](#5. 访问控制)
- [6. 请求限制](#6. 请求限制)
- [7. 日志记录](#7. 日志记录)
- [8. 压缩](#8. 压缩)
- [9. 定向与错误页面](#9. 定向与错误页面)
- [10. 跨域配置](#10. 跨域配置)
- [11. 长连接处理](#11. 长连接处理)
- [12. 代理WebSockets](#12. 代理WebSockets)
- [13. HTTP/2配置](#13. HTTP/2配置)
- [14. GeoIP配置](#14. GeoIP配置)
- [15. 强制HTTPS](#15. 强制HTTPS)
- [16. IP黑名单](#16. IP黑名单)
- [17. 流量控制](#17. 流量控制)
- [18. IP访问控制](#18. IP访问控制)
- [19. 负载均衡](#19. 负载均衡)
- [20. 认证与授权](#20. 认证与授权)
- [21. 缓存](#21. 缓存)
Nginx是一款高效、稳定、可靠的Web服务器软件,同时也可以作为代理服务器、泛型TCP/UDP代理服务器,以及负载均衡器。下面将介绍一些Nginx的高级应用场景和配置技巧。涵盖了Nginx的工作进程数、连接数上限、日志路径、文件类型映射、默认文件类型、日志格式、日志文件路径、sendfile指令、连接超时时间、gzip压缩、虚拟主机配置等基本设置。在实际应用中,根据具体需求对配置进行调整和优化。
1. 配置参数最佳实践
-
worker_processes auto;
这个指令会告诉nginx在服务器上启动多少个worker进程。最佳实践是将其设置为"auto",这样NGINX会自动根据服务器的CPU核心数量启动相应的worker进程。 -
worker_connections 1024;
这个指令会告诉每个worker进程能够处理的最大连接数。如果你的服务器有足够的资源,你可以增加这个数字。 -
sendfile on;
这个指令启用sendfile系统调用,可以更高效地发送文件。 -
tcp_nopush on;
这个指令用于优化TCP包的发送。 -
tcp_nodelay on;
这个指令用于后端连接,使得响应更及时。 -
keepalive_timeout 65;
这个指令设置了客户端与服务器之间的keep-alive连接超时时间。 -
gzip on;
这个指令启用gzip压缩,可以减少客户端和服务器之间传输的数据量。 -
server_tokens off;
这个指令用于关闭服务器的响应头中的版本信息,有助于提高服务器的安全性。 -
client_max_body_size 100m;
这个指令设置了客户端请求体的最大大小。如果你的应用需要用户上传文件,你可能需要调整这个值。 -
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;
这些指令设置了与FastCGI服务器的连接、发送和读取的超时时间。 -
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
这个指令设置了SSL协议的版本。建议使用最新的协议版本以提高安全性。 -
ssl_prefer_server_ciphers on;
这个指令建议服务器使用的加密套件,这有助于提高服务器的安全性。
2. Nginx配置示例
Nginx配置示例,包含了许多常用的配置项。
shell
# 定义工作进程数,通常设置为等于CPU核数
worker_processes auto;
# 进程文件
pid /var/run/nginx.pid;
# 工作模式及连接数上限
events {
worker_connections 1024; # 单个后台worker process进程的最大并发链接数
}
# 设置日志路径,级别等
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 /var/log/nginx/access.log main;
# sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
# 对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 非常重要的应用,可设置为 off,以平衡磁盘 IO 进程,降低系统的 uptime.
sendfile on;
# tcp_nopush on;
# 链接超时时间
keepalive_timeout 65;
# gzip压缩开关
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
# 虚拟主机配置
server {
# 监听端口
listen 80;
# 域名
server_name localhost;
# 默认请求的静态文件前缀
location / {
root html;
index index.html index.htm;
}
# 匹配以.php结尾的请求
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
# 匹配以.html结尾的请求
location ~ /\.ht {
deny all;
}
}
}
3. 常见场景
1. 静态文件服务
Nginx可以将硬盘上的静态文件服务于Web。对于静态内容,Nginx能提供极高的并发支持。
bash
server {
location /static/ {
root /var/www/;
}
}
2. 动态内容代理
Nginx可以作为反向代理服务器,代理后端的动态内容,如PHP、Python应用等。
bash
location / {
proxy_pass http://localhost:8000;
}
3. SSL加密
Nginx支持SSL加密,可以提供HTTPS服务。
bash
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
4. URL重写
Nginx的URL重写功能可以将用户易于理解的URL映射到实际的文件路径或者代理路径。
bash
rewrite ^/user/(\d*)$ /user?id=$1;
5. 访问控制
Nginx可以配置访问控制,禁止或者允许某些IP或者地理位置的用户访问。
bash
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
6. 请求限制
Nginx可以限制并发的连接数量和请求速率,预防服务被恶意请求攻击。
bash
location /login/ {
limit_req zone=one burst=5;
}
7. 日志记录
Nginx提供详细的日志功能,可以记录每个请求的详细信息。
bash
access_log /var/log/nginx/access.log main;
8. 压缩
Nginx可以对响应内容进行GZIP压缩,减少网络传输的数据量。
bash
gzip on;
gzip_types text/plain application/xml;
9. 定向与错误页面
Nginx可以配置重定向和自定义的错误页面。
bash
location /old-url {
rewrite ^ http://www.example.com/new-url permanent;
}
10. 跨域配置
Nginx可以很容易地配置跨域资源共享(CORS)。
bash
location / {
if ($http_origin ~* (https?://.*\.example\.com(:[0-9]+)?$)) {
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
}
}
11. 长连接处理
Nginx可以配置长连接,大大提高效率。
bash
keepalive_timeout 65;
12. 代理WebSockets
Nginx可以配置代理WebSockets,适用于实时通信。
bash
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
13. HTTP/2配置
Nginx支持HTTP/2协议,可以提高网页加载速度。
bash
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
14. GeoIP配置
Nginx可以利用GeoIP模块根据访问者的IP地址判断其物理位置。
bash
location / {
if ($geoip_country_code = CN) {
return 301 http://cn.example.com$request_uri;
}
}
15. 强制HTTPS
Nginx可以强制将HTTP请求跳转到HTTPS。
bash
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
16. IP黑名单
Nginx可以将特定的IP列入黑名单,拒绝其访问请求。
bash
location / {
deny 192.168.1.1;
}
17. 流量控制
利用Nginx的限速模块,可以很容易地对某个位置或者具体用户等进行限速。
bash
location /download/ {
limit_rate 10k;
}
18. IP访问控制
Nginx可以根据访问者的IP地址进行访问控制,比如只允许特定IP访问,或者禁止特定IP访问。
bash
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
19. 负载均衡
Nginx可以作为负载均衡器,将流量分发到多个后端服务器。
bash
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
20. 认证与授权
Nginx支持多种认证方式,如基于IP的访问控制,基于密码的HTTP基本认证,甚至可以通过第三方模块实现OAuth等复杂的认证机制。
bash
location / {
auth_basic "Administrator Login";
auth_basic_user_file /etc/nginx/.htpasswd;
}
21. 缓存
Nginx可以缓存来自后端服务器的响应,以加快对同一请求的响应速度,减轻后端服务器的负担。
bash
proxy_cache_path /path/to/cache levels=1:2 keys_zone=MYCACHE:30m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
server {
location / {
proxy_cache MYCACHE;
proxy_pass http://backend;
}
}