上一篇文章我们已经初步了解Nginx的概念以及作用,现在就让我们在本地部署一个小型的负载均衡Demo
1. 准备3台虚拟机(3台虚拟机需安装lnmp环境)
192.168.28.197 负载均衡服务器
192.168.28.198 web服务器
192.168.28.199 web服务器
2. 在两台web服务器放入测试文件
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx! 192.168.28.198</h1></center>
</body>
</html>
3. 配置负载均衡服务器
http
{
include mime.types;
default_type application/octet-stream;
...
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
server_tokens off;
access_log /var/log/nginx/access.log;
###################################负载均衡设置###########################################
upstream www_koumm_com {
server 192.168.28.198:80 ;
server 192.168.28.199:80 ;
}
#########################################################################################
server
{
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
server_name _;
index index.html index.htm index.php;
root /home/wwwroot;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
include enable-php.conf;
###################################反向代理设置###########################################
location / {
proxy_pass http://www_koumm_com;
}
#########################################################################################
access_log /var/log/nginx/access.log;
}
include vhost/*.conf;
}
4. 验证upstream结点中服务器的4种请求分配
轮询(默认): 每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
nginx中,默认请求分配的方法就是轮询,我们无需修改配置文件,直接访问负载均衡服务器即可
192.168.28.199
根据请求结果,198、199两台web服务器交替被访问,说明轮询请求是正常的。还有一种情况,如果其中一台服务器down掉,这台服务器会不会自动剔除?
我们手动将199这台服务器的Nginx关掉(或者在配置文件中,把这台服务器down掉,server 192.168.28.199:80 down;
),然后重新请求192.168.28.197
,发现请求完全不受199这台机器down掉的影响,所有的请求全部分配到198这台机器上。
weight: 指定轮询的权重,weight和访问成正比,用于后端服务器性能不均的情况
修改配置文件,分别为两台web服务器分配不同的轮询权重:
upstream www_koumm_com {
server 192.168.28.198:80 weight=10;
server 192.168.28.199:80 weight=100;
}
发现请求分配到199服务器的比例明显大于分配到198服务器的比例,说明我们的权重设置是成功的
ip_hash: 每个请求按访问ip的hash结果分配,确保每位访客固定访问一个后端服务器,可以解决session的问题
修改配置文件:
upstream www_koumm_com {
ip_hash;
server 192.168.28.198:80 ;
server 192.168.28.199:80 ;
}
用两台不同的ip分别访问192.168.28.197
,发现每个ip访问的服务器是固定的,说明ip_hash设置是成功的
fair(第三方): 按后端服务器响应时间来分配请求,响应时间短的优先
- 安装fair模块
fair模块是一个第三方模块,nginx在安装时不会自带,所以需要先安装fair模块。(安装第三方模块,实际上是使用--add-module
重新编译安装一次nginx)
1. 下载第三方模块
fair模块
2. 下载对应版本的Nginx源码(因为我是用lnmp一键安装包安装的Nginx,所以需要重新在网上下载Nginx源码)
nginx -v(查看nginx版本)
Nginx-1.12.1源码
另附上lnmp一键安装包
3. 查看之前源码编译Nginx时的参数
[root@CentOS6 conf]# nginx -V
nginx version: nginx/1.12.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/usr/local/lnmp1.4/src/openssl-1.0.2l
4. 在原来编译参数的基础上,加上 --add-module=XXX
,执行新配置并编译(注:只需make
,无需make install
)
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/usr/local/lnmp1.4/src/openssl-1.0.2l --add-module=/root/Downloads/nginx-upstream-fair-master
make
在进行make
操作时,我报了一个gx_http_upstream_srv_conf_t鈥has no member named 'retries'
的错误,解决方法是:修改源码中的 /root/Downloads/nginx-1.12.1/src/http/ngx_http_upstream.h 文件。
需修改的部分:
...
struct ngx_http_upstream_srv_conf_s {
ngx_http_upstream_peer_t peer;
void **srv_conf;
ngx_array_t *servers; /* ngx_http_upstream_server_t */
######################################## Add #########################################
ngx_array_t *values;
ngx_array_t *lengths;
ngx_uint_t retries;
######################################################################################
ngx_uint_t flags;
ngx_str_t host;
u_char *file_name;
ngx_uint_t line;
in_port_t port;
######################################## Add #########################################
in_port_t default_port;
######################################################################################
ngx_uint_t no_port; /* unsigned no_port:1 */
#if (NGX_HTTP_UPSTREAM_ZONE)
ngx_shm_zone_t *shm_zone;
#endif
};
...
5. 复制Nginx
cp objs/nginx /usr/local/nginx/sbin/nginx
-
使用fair进行请求分配
修改配置文件
upstream www_koumm_com {
server 192.168.28.198:80 ;
server 192.168.28.199:80 ;
fair;
}
由于两台测试web服务器的性能一样(完全通过虚拟机copy出来的两台服务器),所以使用fair模块分配请求的效果不是太明显,但相信只要正确安装fair,在高并发、大流量的情况下fair是能起作用的。
如果这篇文章对你有帮助,请点个赞哈,感谢
网友评论