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_pass
和 upstream
**配置文件:**以当前服务器 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.conf
, server2.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;
}
}