网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。
nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
nginx工作在应用层,它的抗并发能力机强,一次可抗住10w个并发。可以作为:web服务器、反向代理、负载均衡,后面两个功能由upstream模块实现。
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)、url_hash(第三方)
[kiosk@foundation38 Desktop]$ scp nginx-1.10.3.tar.gz [email protected]:/root/
[root@vm1 ~]# tar zxf nginx-1.10.3.tar.gz
[root@vm1 ~]# cd nginx-1.10.3/auto/cc
[root@vm1 cc]# vim gcc ##关闭debug模块;目的是不安装在本次实验中多余的软件包
[root@vm1 cc]# cd ..
[root@vm1 auto]# cd ..
[root@vm1 nginx-1.10.3]# yum install gcc -y
[root@vm1 nginx-1.10.3]# yum install pcre-devel -y
[root@vm1 nginx-1.10.3]# yum install openssl-devel -y
[root@vm1 nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module ##编译;http_ssl_module支持https;http_stub_status_module可查看nginx状态信息
[root@vm1 nginx-1.10.3]# make && make install ##安装
[root@vm1 nginx-1.10.3]# cd /usr/local/nginx/
[root@vm1 nginx]# cd conf/
[root@vm1 conf]# useradd -u 900 -s /sbin/nologin nginx ##因为nginx在运行的过程中需要一个child进程起到在cup和内存之间交互信息的作用,而该进程需要以一个nginx用户的身份,所以需要创建该用户
[root@vm1 conf]# id nginx
uid=900(nginx) gid=900(nginx) groups=900(nginx)
[root@vm1 conf]# vim nginx.conf
因为一般服务器有好多个cpu,而正常情况下,进程会在不同的cpu上进行相关运算。比如,当一个进程正在运行,这时又一个优先级较高的进程要先执行,这时候就会断掉该进程,并将该进程的相关程序的内存地址压入堆栈,从而保护现场,当上一个紧急进程执行完后,要出栈恢复现场,这时该进程就会在数个cpu中进行选择,这样在不同cpu间来回选择,总的来说是浪费资源和时间的。所以我们一般会配置使相应的进程和cpu绑定,这样就会解决这个问题。
下面我们来配置使nginx进程和相应cpu绑定,如下图这种方式就是让nginx服务自动选择cpu与child进程绑定:
下图是手动绑定的配置方法: (eg四个:0001 0010 0100 1000)
[root@vm1 conf]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/ ##建立连接
[root@vm1 conf]# nginx -t ##检查语法
[root@vm1 conf]# nginx ##开启
[root@vm1 conf]# netstat -antlpe | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 14758 3474/nginx ##nginx 与apache不共存
检测:访问172.25.38.1
[root@vm1 conf]# vim nginx.conf
## 访问的时候从/下的westos开始访问
[root@vm1 conf]# nginx -t
[root@vm1 conf]# nginx -s reload
[root@vm2: ~]# yum install httpd -y
[root@vm3: ~]# yum install httpd -y
[root@vm2: ~]# cd /var/www/html/
[root@vm2: html]# vim index.html
[root@vm2: html]# cat index.html
vm2
[root@vm2: html]# /etc/init.d/httpd start
[root@vm3 ~]# cd /var/www/html/
[root@vm3 html]# vim index.html
[root@vm3 html]# cat index.html
vm2
[root@vm3 html]# /etc/init.d/httpd start
[root@foundation38 images]# vim /etc/hosts
[root@foundation38 images]# curl www.westos.org
vm2
[root@foundation38 images]# curl www.westos.org
vm3
[root@vm1 conf]# vim nginx.con
[root@vm1 conf]# cd ../html/
[root@vm1 html]# pwd
/usr/local/nginx/html
[root@vm1 html]# mkdir www
[root@vm1 html]# mkdir bbs
[root@vm1 html]# mkdir blog
[root@vm1 html]# cd www
[root@vm1 www]# vim index.html
[root@vm1 www]# cd ../bbs
[root@vm1 bbs]# vim index.html
[root@vm1 bbs]# cd ../blog/
[root@vm1 blog]# vim index.html
[root@vm1 blog]# cd ..
[root@vm1 html]# cd ..
[root@vm1 nginx]# cd conf/
[root@vm1 conf]# nginx -t
[root@vm1 conf]# nginx -s reload
检测:
[root@foundation38 images]# vim /etc/hosts
[root@foundation38 images]# curl blog.westos.org
blog.westos.org
[root@foundation38 images]# curl bbs.westos.org
bbs.westos.org
[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@vm1 conf]# nginx -V ##看是否安装了--with-http_stub_status_modul模块
[root@vm1 conf]# mkdir extra
[root@vm1 conf]# cd extra/
[root@vm1 extra]# vim status.conf ## 打开状态访问控制模块;关闭日志模块
[root@vm1 extra]# cd ..
[root@vm1 conf]# vim nginx.conf ## 让系统去该路径下寻找控制信息的配置模块
## 一个页面可以有多个域名
[root@vm1 conf]# nginx -t
[root@vm1 conf]# nginx -s reload
检测:
[root@foundation38 images]# vim /etc/hosts
[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@foundation38 images]# curl westos.org
www.westos.org
[root@foundation38 images]# curl status.westos.org
Active connections: 1
server accepts handled requests
31 31 33
Reading: 0 Writing: 1 Waiting: 0
注:第一个数字31表示nginx从启动到现在共处理了多少个连接
第二个数字31表示nginx从启动到现在共创建了多少次握手
第一个数字31表示nginx从启动到现在共处理了多少个请求
请求丢失数=握手数-连接数
一个连接可以用多个请求(读/写..)
url:统一资源定位符,用于定位互联网上资源,俗称网址
[root@vm1 conf]# vim nginx.conf
[root@vm1 conf]# nginx -t
[root@vm1 conf]# nginx -s reload
检测:
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org/index.html ##-s静默;-o返回到指定文件;-I只显示文档信息;-w构建一个url地址
401 ###默认匹配。其他都没匹配上就匹配到401
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org
402
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org/ ##有“=”精确匹配,优先级最高,所以把/优先匹配给了402
402
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org/documents/document.html
403
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org/images/1.gif ### ^~优先匹配路径,只要以/images开头,就return404
404
[root@foundation38 images]# curl -s -o /dev/null -I -w %'{http_code}\n' http://www.westos.org/documents/1.gif ##特殊匹配优先级更高
500
优先级: “=” > 有特殊字符的特殊匹配 > 一般匹配
[root@vm1 conf]# vim nginx.conf
rewrite(重写)为固定关键字,表示开始进行rewrite匹配规则。
regex(正则表达式)部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址;" ^ " 表示匹配输入字符串的起始位置, " . "表示匹配除“\n”之外的任何单个字符, " * "表示匹配前面的字符零次或多次。
replacement(替换)部分是http://suzhao.room.com/$1, $1是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag(标记)部分的 permanent表示永久301重定向标记,即永久跳转到新的 http://www.czlun.com/$1 地址上
[root@vm1 conf]# nginx -t
[root@vm1 conf]# nginx -s reload
检测:访问westos.org
阻塞 (等待):磁盘到内存,内核到用户。全过程该线程不可以做其他
非阻塞(盲等待):一个线程不断发出请求问好了吗
select(复用型IO):select先不断接收请求,后一个一个处理
nginx事件驱动机制:接收请求、给号、断线程、回调函数恢复线程。水平触发:只执行一次回调(1次叫号);边缘触发:多次
aio(全异步):得到请求、断开线程、直接磁盘-->内核-->用户。nginx可以用,但要编译源码