nginx功能示例
2.1 Nginx反向代理-示例
前置条件:
有两台服务器:
192.168.70.183 nginx服务器
192.168.71.253 apache服务器
示例结果:
输入www.123.com,跳转到apache服务器主页面
思路
我们直接访问apache服务器:
我们要做的就是访问nginx服务器指定socket,能够到达apache服务器的指定socket
1. 配置nginx.conf
[root@zabbix-svr-2 nginx]# cat nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
####新增部分
server {
listen 8080;
server_name 192.168.70.183;
location / {
proxy_pass http://192.168.71.253:80;
root html;
index index.html index.htm;
}
}
####
}
新增server模块,监听192.168.70.183:8080,proxy_pass http://192.168.71.253:80
请求转向http://192.168.71.253:80
2. 配置访问机器的hosts
我的访问机器是windows,所以需要配置C:\Windows\System32\drivers\etc\hosts
文件
添加
192.168.70.183 www.123.com
3. 访问网址
访问www.123.com:8080
4. 遗留问题
配置nginx监听端口80,使用IP访问可以到达apache服务器,使用域名www.123.com却不行,也可能是机器中的其他配置有问题,笔者也不太清除问题出在哪里。示例效果已经达到了,所以该问题先搁置。
2.2 Nginx负载均衡-详解及示例
2.2.1 负载均衡配置参数简介
1. upstream模块简介
Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和grpc_pass。ngx_http_upstream_module模块有允许Nginx定义一组或多组服务组,使用的可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上。upstream模块可以实现负载均衡,其实隐含了一个重要功能那就是冗余,在一个web节点故障的时候,配置了upstream时可以自动切换到正常工作的节点,这也体现了集群的高可用性。
2. 负载均衡算法简介
调度算法一般分为两类:第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况。第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求。
① 轮询
rr 轮循即round robin 默认调度算法,静态调度算法。客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于 LVS 中的 rr 算法,如果后端节点服务器宕机(默认情况下nginx 只检测80端口)。宕机的服务器会自动从节点服务器池中剔除,以便客户端的用户访问不受影响。新的请求会分配给正产的服务器。
upstream show {
server 192.168.0.141;
server 192.168.0.142;
}
② 权重轮询
wrr即weight 权重轮循,静态调度算法。在 rr 轮循算法的基础上加上权重,即为权重轮循算法,当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题。
upstream show {
server 192.168.0.141 weight=1;
server 192.168.0.142 weight=2;
}
③ ip_hash
ip_hash是静态调度算法,每个请求按客户端 IP 的 hash 结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户 IP 的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的 session 共享问题,但有时会导致请求分配不均,即无法保证 1:1 的负载均衡,因为在国内大多数公司都是 NAT 上网模式,多个客户端会对应一个外部 IP,所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。LVS 负载均衡的-P
参数、keepalived 配置里的 persistence_timeout 50
参数都类似这个 Nginx 里的 ip_hash 参数,其功能均为解决动态网页的 session 共享问题。
upstream show {
ip_hash;
server 192.168.0.141 ;
server 192.168.0.142 ;
}
④ 最小连接数
least_conn是动态调度算法,会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。
upstream show {
least_conn;
server 192.168.0.141 ;
server 192.168.0.142 ;
}
⑤ 最短响应时间
最短响应时间(fair)调度算法是动态调度算法,会根据后端节点服务器的响应时间来分配请求,响应时间端的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短只能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 调度算法的,如果需要使用这种调度算法,必须下载 Nginx 的相关模块 upstream_fair。
upstream show {
fair;
server 192.168.0.141 ;
server 192.168.0.142 ;
}
⑥ url_hash算法
url_hash算法是动态调度算法,按访问 URL 的 hash 结果来分配请求,使每个 URL 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率。(多用于后端服务器为缓存时的场景下)Nginx 本身是不支持 rul_hash的,如果需要使用这种调度算法,必须安装 Nginx 的hash 模块软件包。
upstream show {
server 192.168.0.141 ;
server 192.168.0.142 ;
hash $request_uri;
hash_method crc32;
}
2.2.2 示例演示
前置条件:
有三台服务器:
192.168.70.183 nginx服务器
192.168.71.253 apache服务器,httpd主页面显示"hello apache"
192.168.5.54 apache服务器,httpd主页面显示"hello 5.5 svr"
示例结果:
访问192.168.70.183,将请求平均到两台apache服务器
1. 修改配置文件
[root@zabbix-svr-2 nginx]# cat nginx.conf
...
include /etc/nginx/conf.d/*.conf;
upstream httpdsvr {
server 192.168.71.253:80 weight=2;
server 192.168.5.54:80 weight=1;
}
server {
listen 80;
server_name 192.168.70.183;
location / {
proxy_pass http://httpdsvr;
}
}
}
其中weight表示轮询的权值(即次数),本例中,表示每访问两次253服务器,再访问一次54服务器,然后再访问两次253服务器,依次类推
2. 示例效果
访问负载均衡服务器70.183,会根据权值访问不同的apache服务器
2.3 Nginx动静分离-示例
前置条件:
有两台服务器:
192.168.70.183 nginx服务器
192.168.71.253 apache服务器,httpd主页面显示"hello apache"
示例效果
访问/
(可省略)的资源时,我们认为是静态资源。我们把静态资源直接放在 Nginx 服务器上,通过 Nginx 来直接返回静态资源。
当访问的资源以 .php
为后缀时,我们认为是动态资源。此时通过 Nginx 把请求代理转发至 192.168.71.253服务器上,通过该服务器来处理动态请求。
上面也是常见的前后端分离项目的架构,实际上我们接下来的配置也是示例前后端分离在实际生产上的架构。
1. 修改配置文件
[root@zabbix-svr-2 nginx]# cat nginx.conf
...
server {
listen 80;
server_name 192.168.70.183;
location / {
root /usr/share/nginx/html;
index index.html;
}
location ~\.php$ {
proxy_pass http://192.168.71.253:80;
}
}
}
2. 示例效果
访问192.168.70.183:80
访问192.168.70.183/cgi-bin/test1.php
2.4 结语
关于web server的httpd和nginx两个专栏,笔者只做到了简单介绍和演示,还有很多强大的功能及详细的配置未能介绍。原因有二,一是笔者从事的工作,对web server接触比较少,出于热爱,才进行学习和整理,能力有限,整理的内容也比较初级。二是时间有限,无法把所有配置或问题都整理完全,难免有所遗漏,所以笔者后续如果遇到复杂或有趣的配置,还会持续更新本专栏。