nginx反向代理负载均衡

  1. LNMP架构迁移数据库说明
  2. LNMP架构数据迁移到NFS存储说明
  3. nginx反向代理负载均衡功能

01. 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 [email protected]‘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

02. 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/* ./ 

03. 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.8:/application/nginx/conf/

第三里程:创建模拟测试环境
创建站点目录: mkdir /application/nginx/html/{www,bbs} -p
编写首页文件: for name in www bbs;do echo "$(hostname) name.etiantian.org&quot;&gt;/application/nginx/html/name.etiantian.org&quot; &gt;/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命令进行测试
[[email protected] conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web01 www.etiantian.org
[[email protected] conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web02 www.etiantian.org
[[email protected] conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html
web03 www.etiantian.org

③,nginx反向代理负载均衡模块功能详述
模块常用功能说明:
1)定义后段集群web节点信息,定义一个地址的池子
upstream oldboy {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
2)实现权重负载访问功能,让不同性能的服务器担当不同任务,比如7主机性能好
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。当7,8坏了才会分个9
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;
}
说明:配置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;
}

模块常用功能:

proxy_set_header --设置反向代理服务器到web服务器的HTTP请求报文中的头部信息:nginx反向代理负载均衡

说明:通过以上配置,可以实现访问负载均衡看到不同虚拟主机页面信息
nginx反向代理负载均衡
说明:实现用户访问反向代理服务器,让web服务器日志中记录真实访问的服务器信息

企业案例:
题一
当用户请求www.etiantian.org/upload/xx地址时,实现由upload上传服务器池处理请求。
当用户请求www.etiantian.org/static/xx地址时,实现由静态服务器池处理请求。
除此之外,对于其他访问请求。全都由默认的动态服务器池处理请求。
用户请求(URI) 处理请求服务器 站点目录 功能
/upload 10.0.0.8:88 html/www/upload upload服务器
/static 10.0.0.7:88 html/www/static static静态服务器
/ 10.0.0.9:88 html/www 默认

解题方法:
1)完成nginx服务器配置
第一个里程碑:创建测试环境
10.0.0.8 主机创建upload目录,然后生成网站测试页面文件
mkdir upload
cp oldboy.html upload

10.0.0.7 主机创建static目录,然后生成网站测试页面文件
mkdir static
cp oldboy.html static

10.0.0.9 主机创建默认测试文件即可

第二个里程碑:利用负载均衡服务器进行测试

2)完成nginx反向代理服务器配置

  1. 作业题一说明:
    先进行企业案例需求梳理:
    当用户请求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模块信息
    nginx反向代理负载均衡
    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;
    }
    }
    第一个里程碑:配置upstream模块信息
    nginx反向代理负载均衡
    第二个里程碑:配置proxy_pass模块信息

nginx反向代理负载均衡
题二:根据用户请求客户端软件,显示不同页面信息

nginx反向代理负载均衡

作业题二说明:
根据用户请求客户端软件,显示不同页面信息

解决方法:
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 

测试访问:
[[email protected] conf]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
[[email protected] conf]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
[[email protected] 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;
 }

}