本次实验环境redhat6.5,selinux,iptbles关闭
server1(172.25.92.1)安装nginx
server2和server3安装apache来测试负载均衡
安装nginx
get nginx-1.10.1.tar.gz
tar zxf nginx-1.10.1.tar.gz
cd nginx-1.10.1/src/core/
vim nginx.h
修改此处:
vim nginx-1.10.1/auto/cc/gcc
修改如下:
注释掉dubug之后,编译得到的makefile文件比较小,只有不到1M,不注释会比较大,而且相对慢。
#安装依赖包:
yum install -y pcre-devel gcc openssl-devel #pcre模块的安装是为了实现重写
cd /root/nginx-1.10.1
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_ssl_module --with-http_stub_status_module
#configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。
make && make install
#make是用来编译的,它从Makefile中读取指令,然后编译。
#make install是用来安装的,它也从Makefile中读取指令,安装到指定的位
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx #开启nginx
使用ps axu | grep nginx可以看到nginx默认是以nobody的身份运行,现在将nobody身份改为nginx
vim /usr/local/nginx/conf/nginx.conf
2 user nginx;
useradd -u 800 nginx
nginx -s reload
再次查看进程运行用户变为nginx
配置nginx开启的进程数,一般来说,此配置依据cpu个数来设定.
使用lscpu命令查看cpu个数.
如果是两颗cpu,两个nginx进程的化,可以将进程和cpu绑定,可以减少cpu损耗,如进程在cpu之间的切换等动作
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
worker_cpu_affinity 01 10;
worker_connections 参数控制nginx单进程的最大连接数,如果想要改变需要从三方面更改:
#内核层面:
sysctl -a | grep file #查看打开文件最大数
fs.file-nr = 992 0 188465
fs.file-max = 188465
可知打开最大文件数为188465
#系统层面:
vim /etc/security/limits.conf
在最后添加:
nginx - nofile 65535
#应用层面:
vim /usr/local/nginx/conf/nginx.conf
12 events {
13 worker_connections 65535;
14 }
查看效果:
su - nginx
ulimit -a
可以看出现在单进程处理的最大链接数为65535
,更能实现高并发,并发数是worker_processes和worker_connections的乘积,原本worker_connections是1024,比较小。
27 sendfile on; #此参数会提高webserver性能,是否调用sendfle()函数来输出文件
28 tcp_nopush on;
29 tcp_nodelay on;
33 gzip on; #开启gzip压缩
配置nginx网页加密(ssl):
vim /usr/local/nginx/conf/nginx.conf
108 server {
109 listen 443 ssl; #修改端口
110 server_name localhost; #localhost
111
112 ssl_certificate cert.pem;
113 ssl_certificate_key cert.pem; #私钥和公钥相同
114
115 ssl_session_cache shared:SSL:1m;
116 ssl_session_timeout 5m;
117
118 ssl_ciphers HIGH:!aNULL:!MD5;
119 ssl_prefer_server_ciphers on;
120
121 location / {
122 root html;
123 index index.html index.htm;
124 }
125 }
生成密钥流程:
cd /etc/pki/tls/certs/
vim Makefile #记录了生成公钥做的事
make cert.pem #将签名信息填好
mv cert.pem /usr/local/nginx/conf/
nginx -s reload
netstat -antlp | grep nginx #出现443端口开启
在浏览器访问:也需要下载证书
证书信息:
启用nginx状态模块,记录处理连接的数量,和访问控制
vim /usr/local/nginx/conf/nginx.conf
52 location /status {
53 stub_status on;
54 access_log off;
55 allow 172.25.92.250; #白名单,需要加上访问控制,为了安全
56 deny all; #黑名单
57 }
创建两个虚拟主机,实现访问不同域名,返回不同响应
vim /usr/local/nginx/conf/nginx.conf
126 server {
127 listen 80;
128 server_name www.westos.com;
129
130 location / {
131 root /www1;
132 index index.html;
133
134 }
135 }
136 server {
137 listen 80;
138 server_name bbs.westos.com;
139
140 location / {
141 root /www2;
142 index index.html;
143 }
144 }
测试:
server1上:
mkdir /www1
vim /www1/index.html
www.westos.com-server1
mkdir /www2
bbs.westos.com-server1
vim /www2/index.html
在本机上:
在/etc/hosts文件加解析:
172.25.92.1 www.westos.com bbs.westos.com
可以看见效果
[root@foundation92 Desktop]# curl www.westos.com
www.westos.com-server1
[root@foundation92 Desktop]# curl bbs.westos.com
bbs.westos.com-server1
定义后端服务器群组,后端服务器不一定是80端口,应用层支持端口转发
vim /usr/local/nginx/conf/nginx.conf
18 upstream westos {
19 server 172.25.92.2:80 weight=2; #可以指定后段主机的权重
20 server 172.25.92.3:8080 backup; #也可以指定后端主机为备份主机
21 }
#默认是轮叫算法(rr)
126 server {
127 listen 80;
128 server_name www.westos.com;
129
130 location / {
131 #root /www1;
132 #index index.html;
133 proxy_pass http://westos; #使用proxy_pass模块,指定负载的后端主机
134 }
135 }
136 server {
137 listen 80;
138 server_name bbs.westos.com;
139
140 location / {
141 root /www2;
142 index index.html;
143 }
144 }
nginx -s reload
测试:
#在server2上:安装httpd
vim /var/www/html/index.html
<h1>www.westos.com-server2</h1>
#server3上:安装httpd
vim /etc/httpd/conf/httpd.conf
Listen 8080 #将端口改为8080,根据upstream中
vim /var/www/html/index.html
<h1>www.westso.com-server3</h1>
#在主机上:
vim /etc/hosts
172.25.92.1 www.westos.com
[root@foundation92 Desktop]# curl www.westos.com
<h1>www.westos.com-server2</h1>
[root@foundation92 Desktop]# curl www.westos.com
<h1>www.westso.com-server3</h1>
[root@foundation92 Desktop]# curl www.westos.com
<h1>www.westos.com-server2</h1>
[root@foundation92 Desktop]# curl www.westos.com
<h1>www.westso.com-server3</h1>
也可以使用命令:for i in {1..10}; do curl www.westos.com; done 完成十条请求
可以看出实现了应用层上的负载均衡
使用ip_hash调度算法完成nginx负载均衡,可以解决session的问题。
原理;根据客户端访问的ip调度,ip不变,则请求不变
弊端:数据里流向:client–>cdn–>nginx–>http,nginx拿到的是cdn的ip,如过nginx是ip_hash的话,就只有一个ip数据传输通道,不能满足后端负载均衡。
基于cookie的调度可以解决这个弊端,每个客户端浏览器会有不一>样的cookie值,客户端发送数据包的时候,会把cookie加在数据包中发给服务器,因此可以根据cookie的值来实现ip_hash此种调度策略的负载均衡
使用sticky算法实现nginx调度:
原理:Sticky就是基于cookie的一种负载均衡解决方案,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。请求来了,服务器发个cookie,并说:下次来带上,直接来找我。
sticky的处理过程如下(假设cookie名称为route):
1.客户端首次发起请求,请求头未带route的cookie。nginx接收请求,发现请求头没有route,则以轮询方式将请求分配给后端服务器。
2.后端服务器处理完请求,将响应头和内容返回给nginx。
3.nginx生成route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并创建route的cookie。
5.客户端再次发送请求时,带上route。
6.nginx接收到route,直接转给对应的后端服务器。
普通开源的nginx不支持此种算法,需要添加模块:
server1上:
killall nginx
vim /usr/local/nginx/conf/nginx.conf
18 upstream westos {
19 sticky; #调度算法
20 server 172.25.92.2:80;
21 server 172.25.92.3:8080;
22 }
get nginx-sticky-module-ng.tar.gz
tar zxf nginx-sticky-module-ng.tar.gz
cd nginx-1.10.1
make clean #清除原本的Makefile
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-sticky-module-ng #最后一个要指定好位置
make
make install
nginx
nginx -s reload
测试:在本地加dns解析
在浏览器测试,刷新不会变化,是因为cooike值没有变
在shell命令行测试依然会有负载均衡,原因是shell命令行没有cookie,所以依然使用轮叫的算法。