15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > Nginx---代理、虚拟主机以及负载均衡的配置

Nginx---代理、虚拟主机以及负载均衡的配置

时间:2023-07-14 12:45:01 | 来源:网站运营

时间:2023-07-14 12:45:01 来源:网站运营

Nginx---代理、虚拟主机以及负载均衡的配置:

代理

Nginx中location应用实例

location主要用于对URL进行匹配。 location支持正则表达式匹配,也支持条件判断匹配。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理。
location ~ .*/.(gif|jpg|jpeg|png|bmp|swf)$ { root /data/wwwroot/www.ixdba.net; }
以下这段设置是将upload和html下的所有文件都交给nginx来处理,需要注意的是,upload和html目录是在/data/wwwroot/http://www.ixdba.net目录下的一个子目录。
location ~ ^/(upload|html)/ { root /data/wwwroot/www.ixdba.net; }
在下面这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ { index index.jsp; proxy_pass http://localhost:8080;}


Nginx中location匹配优先级

location支持各种匹配规则,在多个匹配规则下,Nginx对location的处理是有优先级的,优先级高的规则会优先进行处理,而优先级低的规则可能会最后处理或者不进行处理,下面列出location多个匹配规则下,每个规则的处理优先级顺序。
location = / { [ config A ]}location ^~ /images/ { [ config B ]}location ~* /.(gif|jpg|png|swf)$ { [ config C ]} location /abc/def { [ config D ]}location /abc { [ config E ]}location / { [ config F ]}


反向代理与正向代理

反向代理(Reverse Proxy)方式是指通过代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并且将从内部网络服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。当一个代理服务器能够代理外部网络上的访问请求来访问内部网络时,这种代理服务的方式称为反向代理服务。
客户端无法直接访问外部的web,需要在客户端所在的网络内架设一台代理服务器,客户端通过代理服务器访问外部的web(需要在客户端的浏览器中设置代理服务器),这就是正向代理。
正向代理适用于:
①局域网的代理服务器
②访问某个受限网络的代理服务器,如教育网访问某些国外网站需要找代理






反向代理实例

server { listen 80; server_name www.a.com; location / { proxy_pass http://172.16.213.18; }}实现反向代理功能的是一个叫做proxy_pass的模块,这个反向代理实现的功能是:当访问http://www.a.com的时候,所有访问请求都会转发到后端172.16.213.18这个服务器的80端口上。

server { listen 80; server_name www.b.com; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_pass http://172.16.213.77:5601; }}这个反向代理实现的功能是:当访问http://www.b.com的时候,所有访问请求都会转发到后端172.16.213.77这个服务器的5601端口上。与上面那个反向代理实例相比,此反向代理配置增加了一些反向代理属性,这些属性一般用于生产环境下对代理性能要求很高的环境中。




Nginx反向代理uri的用法

server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000; }}nginx的proxy_pass对于此种情况的处理方式是:将location中的uri传递给后端服务器,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/uri/iivey.html 进行访问。




server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000/new_uri/; } }nginx的proxy_pass对于此种情况的处理方式是:替换成proxy_pass指令中URL中含有的uri,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/new_uri/iivey.html 进行访问。

server { server_name www.abc.com; location /uri/ { proxy_pass http://192.168.99.100:8000/; } }nginx的proxy_pass对于此种情况的处理方式是:替换成proxy_pass指令中URL中含有的uri,也就是当客户端访问http://www.abc.com/uri/iivey.html 时,会被反向代理到http://192.168.99.100:8000/iivey.html 进行访问。

这种反向代理方式其实是上面第二种uri代理方式的扩展,这里要重点注意下“proxy_pass http://192.168.99.100:8000/;” 这个url结尾有个“/"和没有”/"的区别。










Nginx内置变量

常见的内置变量有如下几种:? $args,此变量与请求行中的参数相等? $document_root,此变量等同于当前请求的root指令指定的值? $uri,表示不带请求参数的当前URL,$uri不包含主机名。? $document_uri,此变量与$uri含义一样。? $host,此变量与请求头部中“Host”行指定的值一致。? $limit_rate,此变量用来设置限制连接的速率。? $request_method,此变量等同于request的method,通常是“GET”或“POST”。? $remote_addr,此变量表示客户端IP地址。? $remote_port,此变量表示客户端端口。? $remote_user,此变量等同于用户名,由ngx_http_auth_basic_module认证。? $request_filename,此变量表示当前请求的文件的路径名,由root或alias和URI request组合而成。? $request_uri,此变量表示含有参数的完整的初始URI。? $query_string,此变量与$args含义一致。? $server_addr #表示请求的服务器地址。? $server_name,此变量表示请求到达的服务器名。默认是localhost? $server_port,此变量表示请求到达的服务器的端口号。? $request_uri #包含请求参数的原始URI,不包含主机名,由客户端请求决定,不能修改。


以http://188.19.236.18:8000/abc?test=123&test2=abc 为例子:其中: $args:test=123&test2=abc $uri: /abc $server_addr:188.19.236.18 $server_port:8000 $request_filename:abc $request_uri:/abc?test=123&test2=abc例2:http://172.16.213.199:88/test1/test2/test.php ,假定虚拟主机根目录为/var/www/html其中: $host:172.16.213.199 $server_port:88 $request_uri: /test1/test2/test.php $document_uri:/test1/test2/test.php $document_root:/var/www/html $request_filename:/var/www/html/test1/test2/test.php





if指令

f指令用于判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。if指令的使用方法如下:
语法:if (condition) { … }
默认值:none
使用字段:server, location
在默认情况下,if指令默认值为空,可在nginx配置文件的server、location部分使用,另外,if指令可以在判断语句中指定正则表达式或通过nginx内置变量匹配条件等,相关匹配条件如下:
正则表达式匹配规则:? ~ 表示区分大小写匹配 ? ~* 表示不区分大小写匹配 ? !~和!~*分别表示区分大小写不匹配及不区分大小写不匹配文件及目录匹配:? -f和!-f用来判断是否存在文件 ? -d和!-d用来判断是否存在目录 ? -e和!-e用来判断是否存在文件或目录 ? -x和!-x用来判断文件是否可执行


rewrite指令

Nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但要使用rewrite功能,需要PCRE支持,应在编译nginx时指定PCRE源码目录。rewrite的使用语法如下:
语法:rewrite regex flag
默认值:none
使用字段:server, location, if
rewrite指令的最后一项参数为flag标记,其支持的flag标记主要有以下几种:? last, 相当于Apache里的[L]标记,表示完成rewrite之后搜索相应的URI或location。? break,表示终止匹配, 不再匹配后面的规则。? redirect,将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。? permanent,将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址。 其中,last和break用来实现URL重写,浏览器地址栏中的URL地址不变。


location ~ ^/new/ { rewrite ^/new/(.*)$ /old/$1 break; proxy_pass http://www.tb.com; }
在这个例子中,假定访问的域名是www.newtb.com,那么当访问http://www.newtb.com/new/web.html时,nginx可以通过rewrite将页面重定向到http://www.tb.com/old/web.html,由于是通过反向代理实现了重定向,因此页面重写后不会引起浏览器地址栏中URL的变化。这个功能在新旧网站交替的时候非常有用。



set指令

通过set指令可以设置一个变量并为其赋值,其值可以是文本、变量或它们的组合。也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。

set使用语法如下:
语法:set variable value
默认值:none
使用字段:server, location, if
location / { if ($query_string ~ "id=(.*)") { set $myid $1; rewrite ^/app.php$ /m-$myid.html?; }}
这是一个伪静态的例子,假如访问的域名是http://www.abc.com,那么上面这个配置要实现的功能是将请求为http://www.abc.com/app.php?id=100重定向到http://www.abc.com/m-100.html
这里用到了if指令和set指令,并且还使用了$query_string变量,此变量用于获取请求行中的参数,if指令用来判断请求参数中的id值,然后通过set指令定义了一个变量$myid,并将$query_string变量中获取到的id值赋给$myid,最后通过rewrite指令进行了url重写。
这里需要注意的是:rewrite只能针对请求的uri进行重写,而对请求参数无能为力,/app.php问号后面的“id=100”是请求参数,要获取到参数,需要使用nginx的一个内部变量$query_string,这样在重写的时候只需把$query_string变量追加到重写的uri后面即可,另外,为了防止url中的参数追加到重写后的uri上,需要在rewrite最后面加个问号。



break指令

break的用法在前面的介绍中其实已经出现过,它表示完成当前设置的规则后,不再匹配后面的重写规则。break使用语法如下:
语法:break
默认值:none
使用字段:server, location, if
server { listen 80; server_name www.tb.cn; if ($host != 'www.tb.cn') { rewrite ^/(.*)$ http://www.tb.cn/error.txt break; rewrite ^/(.*)$ http://www.tb.cn/$1 permanent; }}
在这个例子中,定义了一个域名http://www.tb.cn,当访问的域名不是http://www.tb.cn时,会将请求重定向到“http://www.tb.cn/error.txt” 页面, 由于设置了break指令,因此下面的rewrite规则不再被执行,直接退出。而当访问的域名是http://www.tb.cn时,将直接执行最后一个rewrite指令。
这里需要重点掌握一下break的功能,它表示完成当前设置的规则后,不再匹配后面的重写规则,也就是当满足if指令后,直接退出,而不会去执行最后一个rewrite指令的规则。









虚拟主机配置

虚拟主机功能是Nginx经常用到的一个特性,每个虚拟主机就是一个独立的站点,对应一个域名,如果需要多个域名指向到一个IP上时,通过虚拟主机功能可以轻松实现。

http { server { listen 80; server_name www.domain1.com; access_log logs/domain1.access.log main; location / { index index.html; root /data/www/domain1.com; } } server { listen 80; server_name www.domain2.com; access_log logs/domain2.access.log main; location / { index index.html; root /data/www/domain2.com; } } include /usr/local/nginx/conf/vhosts/www.domain3.conf;}





负载均衡配置

Nginx的负载均衡模块目前支持4种调度算法,下面分别进行介绍,其中后两项属于第三方的调度方法。
轮询(默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器死机,故障系统被自动剔除,使用户访问不受影响。
Weight,指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair,比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
http { upstream myserver { server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s; server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s; server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s; } server { listen 80; server_name www.domain.com 192.168.12.189; index index.htm index.html; root /data/web/wwwroot; location / { proxy_pass http://myserver; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; include /usr/local/nginx/conf/proxy.conf; } }}

关键词:负载,均衡,配置,代理,虚拟,主机

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭