nginx常见配置介绍

1 server_name 配置

在配置文件中,如果只存在一个 server,那么无论什么域名解析到该主机IP,都会访问该唯一 server,只有在配置多个 server 时,才会进行精准匹配。

我们以下面的DNS配置进行举例说明:

127.0.0.1 www.server1.com
127.0.0.1 www.server2.com
127.0.0.1 www.other-server.com

1.1 仅有一个 server

在以下的配置中,如果只有一个 server,那么访问 www.server1.com www.server2.com www.other-server.com 该 server,并且页面显示 “localhost”。

server {
	listen 80;
	server_name localhost;
	
	location / {
		default_type text/html;
		echo "localhost";
	}
}

1.2 有多个 server

在以下配置中,如果有多个server,那么将匹配 server_name 进行访问,如果匹配完成后,没有对应的 server_name,那么将选择server顺序最靠前的进行处理。

例如,在以下的配置中,访问结果如下:

  • 如果访问 localhost,则页面显示 ”localhost“
  • 如果访问 www.server1.com,则页面显示 ”www.server1.com“
  • 如果访问 www.server2.com,则页面显示 ”www.server2.com“
  • 如果访问 www.other-server.com,则页面显示 ”localhost“
server {
	listen 80;
	server_name localhost;
	
	location / {
		default_type text/html;
		echo "localhost";
	}
}

server {
	listen 80;
	server_name www.server1.com;
	
	location / {
		default_type text/html;
		echo "www.server1.com";
	}
}

server {
	listen 80;
	server_name www.server2.com;
	
	location / {
		default_type text/html;
		echo "www.server2.com";
	}
}

1.3 有多个 server,但有 default 参数

如果 listen 选项中有 default 参数,则表明该这个端口下,此 server 的优先级最高,如果有访问请求,在匹配完所有的 server_name 后,仍然没有对应的server ,则该server作为默认响应。

例如,在以下的配置中,所有内容均与 1.2 的配置文件一致,只是在 www.server1.com 的 server 上添加了 default参数,如果访问 www.other-server.com,则页面显示为 ”www.server1.com“,而不是之前的 ”localhost“。

server {
	listen 80;
	server_name localhost;
	
	location / {
		default_type text/html;
		echo "localhost";
	}
}

server {
	listen 80 default;
	server_name www.server1.com;
	
	location / {
		default_type text/html;
		echo "www.server1.com";
	}
}

server {
	listen 80;
	server_name www.server2.com;
	
	location / {
		default_type text/html;
		echo "www.server2.com";
	}
}

2 location 配置

2.1 配置参数

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
  • ~ 开头表示区分大小写的正则匹配 以xx结尾
  • ~* 开头表示不区分大小写的正则匹配 以xx结尾
  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。

2.2 配置示例

以主机为 localhost 为例:

location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

那么产生的效果如下:

访问根目录/, 比如http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C

访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,

http://localhost/a.XHTML不会匹配规则G,(因为!)。规则F,规则G属于排除法,符合匹配规则也不会匹配到。

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

2.3 常见配置

# 配置首页规则,因为通过域名访问网站首页比较频繁,使用此规则可以加速处理
location = / {
    proxy_pass http://tomcat:8080/index;
}
 
# 处理静态文件请求,这是nginx作为http服务器的强项
location ^~ /static/ {                              //以xx开头
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {     //以xx结尾
    root /webroot/res/;
}
 
#通用规则,用来转发动态请求到后端应用服务器
location / {
    proxy_pass http://tomcat:8080/
}

3 反向代理

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。

目前web网站使用反向代理,除了可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。

此外,反向代理还用于解决前后端分离项目中的跨域问题

server {
	listen	8080;
	server_name localhost;
	
	location / {
	    # 访问 http://localhost:8080 将反向代理到 http://192.168.1.21
		proxy_pass http://192.168.1.21;
		proxy_set_header Host $host:$server_port;
	}
}

4 负载均衡

负载均衡是一种比较常见的环节服务器压力的技术,通过负载均衡,我们将一台服务器面临的压力分散到多台服务器上。通常情况下,我们使用nginx作为负载均衡的主要服务端。

4.1 配置文件

关键配置: proxy_passupstream

**配置文件:**以当前服务器 IP 为 192.168.1.20 为例,分别在主机 192.168.1.21 和 192.168.1.22 上部署了一个监听了 80 端口的服务端程序。

http {
	# 定义一个负载均衡群组,名称为 upstream_name
    upstream upstream_name{
        server 192.168.1.21:80;
        server 192.168.1.22:80;
    }

    server {
        listen       8080;
        server_name  localhost;

        location / {
        	# 反向代理配置
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

此时,如果访问 192.168.1.20:8080,返回的内容将分别由 192.168.1.21 或 192.168.1.22 返回内容,具体是哪台服务器,由nginx的调度算法决定。

4.2 负载均衡参数

nginx 的负载均衡参数有以下几个:

参数描述
fail_timeout与max_fails结合使用
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s。
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down标记服务器永久停机了。

4.3 负载均衡策略

在实际运用中,需要根据不同的场景选择不同的策略,大多是多种策略结合使用以达到实际需求的性能。

4.3.1 轮询

最基本的配置方法,它是 upstream 的默认策略,每个请求会按时间顺序逐一分配到不同的后端服务器。

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。

4.3.2 权重

在轮询策略的基础上制定沦陷的几率。例如

upstream foo {
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

这里例子中,weight参数用于制定轮询的几率,weight默认值为1;weight的数值和被访问的几率成正比。

注意:

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与 least_conn 和 ip_hash 结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。

4.3.3 ip_hash

负载均衡器按照客户端IP地址的分配方式,可以确保相同客户端的请求一直发送到相同的服务器。这样每个访客都固定访问一个后端服务器。

upstream foo {
    ip_hash;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
  • ip_hash不能与backup同时使用。
  • 此策略适合有状态服务,比如session。
  • 当有服务器需要剔除,必须手动down掉。

4.3.4 least_conn 最小连接

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果

upstream foo {
    least_conn;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:

  • 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

5 include 指令

在 nginx 配置文件中,可以使用 include 指令导入文件。该指令可用于对多个配置文件进行拆分整理,方便配置文件的维护。

假设配置文件存放路径为 /var/nginx/conf,主配置文件名为 nginx.conf

nginx.conf配置文件如下:

server {
	listen 8080 default;
	server_name _;
	
	include location/*.conf;
}

/var/nginx/conf下新建文件夹 location,并在 /var/nginx/conf/location下新建两个文件:server1.confserver2.conf

server1.conf文件内容如下:

location /server1 {
	proxy_pass http://192.168.1.20;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

server2.conf文件内容如下:

location /server2 {
	proxy_pass http://192.168.1.21;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

以上配置等效于以下的配置:

server {
	listen 8080 default;
	server_name _;
	
	location /server1 {
		proxy_pass http://192.168.1.20;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
	
	location /server2 {
		proxy_pass http://192.168.1.21;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值