Nginx基本配置!

反向代理

允许Nginx将来自客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端。

使用location块中的proxy_pass指令:

  • proxy_pass:定义后端服务器的地址。

  • proxy_set_header:修改从客户端传递到代理服务器的请求头。

  • proxy_hide_header:隐藏从代理服务器返回的响应头。

  • proxy_redirect:修改从代理服务器返回的响应头中的LocationRefresh头字段。

注意事项

  • 当使用proxy_pass指令时,确保后端服务器是可用的,否则Nginx将返回错误。

  • 使用proxy_set_header确保后端服务器接收到正确的请求头。

1
2
3
location /some/path/ {
proxy_pass http://your_backend_address;
}

例子:所有发送到example.com的请求都被代理到localhost:8080

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name example.com;

location / {
proxy_pass http://localhost: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;
}
}

负载均衡

当有多台服务器时,代理服务器根据规则将请求分发到指定的服务器上处理。

策略名称 描述 示例
RR (round robin) 默认的负载均衡方法,按时间顺序逐一分配到不同的后端服务器 upstream web_servers { server localhost:8081; server localhost:8082; }
热备 当主服务器发生故障时,才将流量转发到备用服务器 upstream web_servers { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; }
权重 根据预设权重分配请求,权重越高的服务器接收的请求越多 upstream web_servers { server localhost:8081 weight=1; server localhost:8082 weight=2; }
ip_hash 根据客户端IP地址的hash结果分配请求,确保特定客户端IP的请求总是发给同一个后端服务器 upstream test { ip_hash; server localhost:8080; server localhost:8081; }
fair (第三方) 根据后端服务器的响应时间分配请求,响应时间短的优先分配 upstream backend { fair; server localhost:8080; server localhost:8081; }
url_hash (第三方) 根据请求的URL的hash结果分配请求,确保同一个URL的请求总是发给同一个后端服务器 upstream backend { hash_method crc32; hash $request_uri; server localhost:8080; server localhost:8081; }

权重:weight 越高,被分配的请求越多,默认为 1。

1
2
3
4
upstream myserver {   
server 192.167.4.32:5000 weight=10;
server 192.168.4.32:8080 weight=5;
}

动静分离

动静分离是指将动态内容和静态内容分开处理。

  • 静态内容通常包括:图片、CSS、JavaScript、HTML文件等,这些内容不需要经常更改。

  • 而动态内容则是经常变化的,如:PHP、ASP、JSP、Servlet等生成的内容。

注意事项

  • 确保静态文件路径配置正确,避免404错误。
  • 使用expires指令为静态内容设置缓存,这可以减少服务器的负载并提高页面加载速度。

直接为静态内容设置一个别名或根目录。

所有的静态文件都被存放在/path/to/static/files目录下。

  • expires指令设置了静态文件的缓存时间。
1
2
3
4
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
root /path/to/static/files;
expires 30d; # 设置缓存时间
}

使用alias别名。

如果静态文件不在项目的主目录下,可以使用alias来指定静态文件的实际路径。

URL中的/static/会映射到文件系统的/path/to/static/files/

1
2
3
location /static/ {
alias /path/to/static/files/;

代理动态内容:

  • 对于动态内容,可能需要将请求代理到后端的应用服务器,如Tomcat、uWSGI等。
1
2
3
4
5
location / {
proxy_pass http://backend_server_address;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

跨域

跨域资源共享(CORS)是一种安全策略,用于控制哪些网站可以访问资源。

当前端应用程序和后端API位于不同的域上时,通常会遇到跨域问题。

  • Nginx可以通过设置响应头来帮助解决这个问题。

在生产环境中,出于安全考虑,建议不要使用 'Access-Control-Allow-Origin' '*',而是指定确切的域名。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
location / {
# 其他配置...

# 设置允许来自所有域名请求。如果需要指定域名,将'*'替换为您的域名。
add_header 'Access-Control-Allow-Origin' '*';

# 允许的请求方法。
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

# 允许的请求头。
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

# 允许浏览器缓存预检请求的结果,单位为秒。
add_header 'Access-Control-Max-Age' 1728000;

# 允许浏览器在实际请求中携带用户凭证。
add_header 'Access-Control-Allow-Credentials' 'true';

# 设置响应类型为JSON。
add_header 'Content-Type' 'application/json charset=UTF-8';

# 针对OPTIONS请求单独处理,因为预检请求使用OPTIONS方法。
if ($request_method = 'OPTIONS') {
return 204;
}
}

防盗链

防盗链是指防止其他网站直接链接到你的网站资源(如图片、视频等),从而消耗服务器带宽。

  • Nginx提供了一个非常方便的模块——ngx_http_referer_module,用于实现防盗链功能。

valid_referers

  • 定义了合法的来源页面:none表示直接访问,blocked表示没有Referer头的访问。
  • www.example.comexample.com是合法的来源域名。
  • *.example.net表示example.net的所有子域名都是合法的来源。

$invalid_referer

  • 会在来源不在valid_referers列表中时变为”true”。
  • 如果来源不合法,服务器将返回403禁止访问的状态码。

防盗链配置可能会影响搜索引擎的爬虫,因此在实施防盗链策略时要小心。

如果网站使用了CDN,确保CDN的服务器也在valid_referers列表中,否则CDN可能无法正常工作。

1
2
3
4
5
6
7
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.example.com example.com *.example.net;

if ($invalid_referer) {
return 403;
}
}

使用错误图片代替原图片。

如果不想显示403错误,而是想显示一个错误图片(例如:“禁止外链”的图片),可以这样配置。

1
2
3
4
5
6
7
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.example.com example.com *.example.net;

if ($invalid_referer) {
rewrite ^/.*$ /path/to/error/image.jpg;
}