Linux三阶段之十:nginx反向代理负载均衡
十、nginx反向代理负载均衡
(一)LNMP架构迁移数据库说明
迁移数据库:利用数据库备份命令(mysql mysqladmin mysqldump)
1) 备份数据库数据库信息
mysqldump -uroot -poldboy123 --all-databases >/tmp/bak.sql ll /tmp/bak.sql -h scp /tmp/bak.sql 172.16.1.51:/tmp/
2) 恢复数据库数据库信
##db01 mysql -uroot -poldboy123 </tmp/bak.sql ###db01添加新的用户 grant all on wordpress.* to ‘172.16.1.0/255.255.255.0‘ identified by ‘oldboy123‘; flush privileges; mysql -uwordpress -poldboy123 -h 172.16.1.51
3) 数据库迁移完毕,修改网站连接数据库的配置文件
mysql -uwordpress -poldboy123 -h 172.16.1.51 <-- 修改配置文件之前,先测试网站web服务器与迁移后的数据库连通性 vim wp-config.php <-- 修改wordpress上的数据库连接参数信息 /** MySQL主机 */ define(‘DB_HOST‘,‘172.16.1.51‘) <-- 修改连接的主机信息,将localhost修改为172.16.1.51 说明:web服务器数据库此时可以关闭了
4)停止nginx服务器上MySQL服务
/etc/init.d/mysql stop
(二)LNMP架构数据迁移到NFS存储说明
01:先将原有目录中数据移出
cd /application/nginx/html/blog/wp-content/uploads mkdir /tmp/wordpress_backup -p mv ./* /tmp/wordpress_backup/ 数据存储到本地什么位置,获取方法 ①. 通过网站页面右键点击,获取资源地址信息 ②. find命令利用-mmin 5 ③. 利用inotify服务监控目录数据变化
02:NFS服务器上配置创建共享目录
vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash) showmount -e 172.16.1.31 mount -t nfs 172.16.1.31:/data /mnt/ showmount -e 172.16.1.31 mount -t nfs 172.16.1.31:/data/ ./uploads/ mv /tmp/wordpress_backup/* ./
(三)nginx反向代理负载均衡功能
客户端====代理服务器===web服务器 客户端看到的服务端==代理服务器 代理服务器====web服务器 反向代理功能架构 3台web服务器,组建出web服务器集群 web01 10.0.0.7 172.16.1.7 web02 10.0.0.8 172.16.1.8 web03 10.0.0.9 172.16.1.9 1台负载均衡服务器 lb01 10.0.0.5 172.16.1.5
①. 部署web服务器
第一个里程:安装部署nginx软件
mkdir /server/tools -p cd /server/tools wget http://nginx.org/download/nginx-1.12.2.tar.gz tar xf nginx-1.12.2.tar.gz yum install -y pcre-devel openssl-devel useradd -M -s /sbin/nologin www cd nginx-1.12.2 ./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module make && make install ln -s /application/nginx-1.12.2 /application/nginx /application/nginx/sbin/nginx netstat -lntup|grep nginx
第二个里程:编辑nginx配置文件
server { listen 80; server_name www.etiantian.org; root html/www; index index.html index.htm; } server { listen 80; server_name bbs.etiantian.org; root html/bbs; index index.html index.htm; } scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/ scp -rp /application/nginx/conf/nginx.conf 172.16.1.9:/application/nginx/conf/
第三里程:创建模拟测试环境
mkdir /application/nginx/html/{www,bbs} -p for name in www bbs;do echo "$(hostname) $name.etiantian.org" >/application/nginx/html/$name/oldboy.html;done for name in www bbs;do cat /application/nginx/html/$name/oldboy.html;done
第四里程:在负载均衡服务器上,进行测试访问
curl -H host:www.etiantian.org 10.0.0.7/oldboy.html web01 www.etiantian.org curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html web01 bbs.etiantian.org curl -H host:www.etiantian.org 10.0.0.8/oldboy.html web02 www.etiantian.org curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html web02 bbs.etiantian.org curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html web03 bbs.etiantian.org
②. 部署负载均衡服务器
第一个里程:安装部署nginx软件
mkdir /server/tools -p cd /server/tools wget http://nginx.org/download/nginx-1.12.2.tar.gz tar xf nginx-1.12.2.tar.gz yum install -y pcre-devel openssl-devel useradd -M -s /sbin/nologin www cd nginx-1.12.2 ./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module make && make install ln -s /application/nginx-1.12.2 /application/nginx /application/nginx/sbin/nginx netstat -lntup|grep nginx
第二个里程:编写nginx反向代理配置文件
grep -Ev "#|^$" nginx.conf.default >nginx.conf 官方链接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream Syntax: upstream name { ... } Default: — Context: http eg: upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } 说明:upstream模块就类似定一个一个地址池或者说定一个web服务器组 官方链接:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except eg: location / { proxy_pass http://oldboy; } 说明:proxy_pass主要用于进行抛送用户访问请求给upstream模块中的相应节点服务器 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 80; server_name localhost; root html; index index.html index.htm; location / { proxy_pass http://oldboy; } } } /application/nginx/sbin/nginx -t /application/nginx/sbin/nginx -s reload
第三个里程:进行访问负载均衡服务器测试
1)利用浏览器进行测试 进行hosts解析 http://www.etiantian.org/oldboy.html <--利用ctrl+F5刷新测试,检查是否进行负载调度 2)利用curl命令进行测试 [ conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html web01 www.etiantian.org [ conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html web02 www.etiantian.org [ conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html web03 www.etiantian.org
(四)Nginx反向代理负载均衡模块功能详述
ngx_http_upstream_module http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
①模块常用功能说明:
1)定义后端集群web节点信息,定义一个地址的池子
upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; }
2)实现权重值负载访问功能
upstream oldboy { server 10.0.0.7:80 weight=3; server 10.0.0.8:80 weight=1; server 10.0.0.9:80 weight=1; }
3)定义后端访问的失败次数-max_fails
upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=3; server 10.0.0.8:80 weight=1 max_fails=3; server 10.0.0.9:80 weight=1 max_fails=3; }
4)定义后端失败重试的间隔-fail_timeout
upstream oldboy { server 10.0.0.7:80 weight=3 max_fails=3 fail_timeout=10s; server 10.0.0.8:80 weight=1 max_fails=3; server 10.0.0.9:80 weight=1 max_fails=3; } 说明:在尝试多次失败后,在超时时间过去之后,会再给相应节点一次机会
5)定义后端服务的热备节点-backup
upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; }
②模块常用调度算法:
1)定义轮询调度算法-rr-默认调度算法 采取平均分配 2)定义权重调度算法-wrr 能者多劳 3)定义静态调度算法-ip_hash upstream oldboy { ip_hash; server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; } 说明:配置ip_hash时,一定不能和backup与weight参数同时出现 4)定义最小的连接数-least_conn upstream oldboy { least_conn; server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80 backup; }
③模块常用功能(ngx_http_proxy_module)
proxy_set_header --- 设置反向代理服务器到web服务器的HTTP请求报文中的头部信息 server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; } } server { listen 80; server_name bbs.etiantian.org; proxy_set_header host $host; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; } } 说明:通过以上配置,可以实现访问负载均衡看到不同虚拟主机页面信息(oldboy,相当于使用ip地址访问虚拟主机,默认访问的是第一个server) server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } } server { listen 80; server_name bbs.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://oldboy; proxy_set_header X-Forwarded-For $remote_addr; } } 说明:实现用户访问反向代理服务,让web服务器日志中记录真实用户IP地址信息
(五)案例:
先进行企业案例需求梳理: 当用户请求www.etiantian.org/upload/xx 地址时,实现由upload上传服务器池处理请求。 当用户请求www.etiantian.org/static/xx 地址时,实现由静态服务器池处理请求。 除此以外,对于其他访问请求,全都由默认的动态服务器池处理请求。 用户请求(URI) 处理请求服务器 站点目录 功能 /upload 10.0.0.8:80 html/www/upload upload服务器 /static 10.0.0.7:80 html/www/static static静态服务器 / 10.0.0.9:80 html/www 默认
解题方法:
1)完成nginx网站服务器配置
第一个里程:创建测试环境
# 10.0.0.8 主机上创建upload目录,然后生成网站测试页面文件 cd /application/nginx/html/www/ mkdir upload cp oldboy.html upload/ # 10.0.0.7 主机上创建static目录,然后生成网站测试页面文件 cd /application/nginx/html/www/ mkdir static cp oldboy.html static/ # 10.0.0.9 主机上创建默认测试页面文件即可
第二个里程:利用lb01进行访问测试
# 测试10.0.0.8访问是否正常 curl -H host:www.etiantian.org 10.0.0.8/upload/oldboy.html web02 www.etiantian.org # 测试10.0.0.7访问是否正常 curl -H host:www.etiantian.org 10.0.0.7/static/oldboy.html web01 www.etiantian.org # 测试10.0.0.9访问是否正常 curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org
2)完成nginx反向代理服务器配置
第一个里程:配置upstream模块信息
upstream upload { server 10.0.0.8:80; } upstream static { server 10.0.0.7:80; } upstream default { server 10.0.0.9:80; }
第二个里程:配置proxy_pass模块信息
server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://default; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /upload { proxy_pass http://upload; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /static { proxy_pass http://static; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
例题2:
根据用户请求客户端软件,显示不同页面信息
解决方法:
1)nginx网站服务器配置
第一个里程:创建测试环境
# 10.0.0.8 主机上创建upload目录,然后生成网站测试页面文件 cd /application/nginx/html/www/ cat oldboy.html # 10.0.0.7 主机上创建static目录,然后生成网站测试页面文件 cd /application/nginx/html/www/ cat oldboy.html # 10.0.0.9 主机上创建默认测试页面文件即可 cd /application/nginx/html/www/ cat oldboy.html 测试访问: [ conf]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html web01 www.etiantian.org [ conf]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html web02 www.etiantian.org [ conf]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html web03 www.etiantian.org
2)nginx反向代理服务器配置
第一个里程:配置upstream模块信息
upstream iphone { server 10.0.0.8:80; } upstream android { server 10.0.0.7:80; } upstream pc { server 10.0.0.9:80; }
第二个里程:配置proxy_pass模块信息
server { listen 80; server_name www.etiantian.org; root html; index index.html index.htm; location / { if ($http_user_agent ~* "iphone") { proxy_pass http://iphone; } if ($http_user_agent ~* "android") { proxy_pass http://android; } proxy_pass http://pc; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }