nginx的核心功能有如下几种:
1.http 可以用来做web服务器和反向代理服务器
2.mail 可以用来当做邮件服务器
3.stream 用来做负载均衡
我们来演示以下nginx的几种用法
nginx反向代理
nginx反向代理有两种模式:
1.第一种是后端服务器为httpd+php模块实现的,就是nap(nginx+httpd/php_module),在这个环境中,后端服务器是httpd,监听端口默认为80,nginx是作为httpd的客户端存在的,当用户发来请求时,nginx接收用户请求,然后读取用户请求,并判断用户的请求数据,根据用户的请求重新生成新的请求发送到相应的后端服务器
实现步骤:
(1)环境:nginx服务器172.16.200.102,后端ap(httpd+php)服务器172.16.104。先关闭每台虚拟机上的iptables 和selinux
(2)配置反向代理服务器
[root@localhost ~]# yum -y install nginx #安装nginx
[root@localhost ~]# rpm -qi nginx #这里使用的版本为1.10.2版本的nginx
[root@localhost ~]# service nginx start #开启nginx
Name : nginx Relocations: (not relocatable)
Version : 1.10.2 Vendor: Fedora Project
...
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
删除两个listen条目中的defalut_server,default表示当前server为默认的server。将这个文件中的default_server删除,再去指定我们要创建的新server为默认server,要不会提示有重复的default配置
listen 80 ;
listen [::]:80;
[root@localhost ~]# vim /etc/nginx/conf.d/nap.conf #nginx配置文件http段默认包含/etc/nginx/conf.d/*.conf文件,我们就在这个文件中写一个server段
server {
listen 80 default; #监听80端口
server_name www.feng.com; #默认域名
location / {
index index.php index.html
}
location ~* \.html$ { #将.html结尾的页面请求到本地直接处理
root /usr/share/nginx/html
}
location ~* \.php$ {
proxy_pass http://172.16.200.104; #使用proxy_pass模块来将请求发送到后端服务器172.16.200.104,注意,反向代理不是直接转发请求的,而是经过处理后自己重新发送请求包给后端服务器的,所以叫做代理,和调度不是一样的。locattion 后边是正则匹配时,proxy_pass 后边的URL最后一定不能加/,不然会报错。
}
}
[root@localhost ~]# nginx -t #测试配置文件是否正确
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost conf.d]# nginx -s reload #配置文件没问题后就重载配置文件,让刚才写入的server生效
[root@localhost conf.d]# echo "172.16.200.102 index.html" > /usr/share/nginx/html/index.html #修改主页文件,清楚的显示当前页面是哪个
(3)配置后台服务器
[root@localhost html]# yum -y install httpd php #安装httpd和php
[root@localhost html]# vim /var/www/html/index.php #编写测试页面,加入以下内容
(4)测试
使用浏览器访问172.16.200.102/index.php页面,看到php状态页面,证明实验成功
2.第二种是nginx加上php-fpm来实现的,php-fpm具有一定的web服务功能,可以直接使用php-fpm来当作动态内容服务器
(1)实验环境,代理服务器为172.16.200.102,后端服务器为172.16.200.103.接上一个实验的环境,将nap.conf中的listen行的default删掉。
(2)还是在102服务器上/etc/nginx/conf.d目录下,重新创建个文件np.conf,在这个文件中创建一个新的server
[root@localhost conf.d]# vim np.conf
server {
listen 80 default;
server_name www.feng.com;
location / {
index index.php index.html;
}
location ~* \.html$ {
root /usr/share/nginx/html;
}
location ~* \.php$ {
fastcgi_pass 172.16.200.103:9000;
fastcgi_index index.php; #后端服务器的主页
fastcgi_param SCRIPT_FILENAME /app/html$fastcgi_script_name; #由于后台服务端是php-fpm服务,不能直接传递客户的访问信息,所以用这个参数来传递匹配到的内容到后台服务端。
include fastcgi_params; #fastcgi_params文件设置了很多参数,不需要我们再去写入,直接将文件包含进去即可。
}
}
[root@localhost conf.d]# nginx -t
[root@localhost conf.d]# nginx -s reload
(3)配置后端服务器
[root@localhost html]# yum -y install php-fpm
[root@localhost html]# vim /etc/php-fpm.d/www.conf #到配置文件中设置
listen = 9000 #监听端口设为监听所有网卡的9000端口
listen.allowed_clients = 172.16.200.102 #允许访问的客户端,设置为反向代理服务器ip
设置完成后,就可以启动了
[root@localhost html]# service php-fpm start
Starting php-fpm: [ OK ]
[root@localhost html]# ss -tnlp|grep 9000
LISTEN 0 128 *:9000 *:* users:(("php-fpm",3488,7),("php-fpm",3489,0),("php-fpm
",3490,0),("php-fpm",3491,0),("php-fpm",3492,0),("php-fpm",3494,0))
写一个测试文件,对应代理服务器中的指定位置
[root@localhost html]# mkdir -p /app/html
[root@localhost html]# vim /app/html/index.php
(4)测试
用浏览器访问172.16.200.102/index.php,出现测试页面,证明实验成功
nginx缓存
nginx的缓存功能在反向代理段中实现,我们在第一个实验的nap.conf文件中加入缓存的内容,再次将np.conf文件中的default换到nap.conf中
缓存存储的方式为key/values,key是将指定的URL段经过hash后,成为等长度的字符串,存放在内存中。而values就是URL对应的内容了,存放在磁盘上的规划好的目录中,目录结构是由hash完的key值的从后往前数几位为一个目录结构所构成的,比如设置目录结构levels=2:1:1,那么第一层目录就是hash值的后两个字符组成,每个字符有16位,2个字符就是256位,以此类推。
1.在/etc/nginx/nginx.conf中定义缓存,注意只能写在http段中,写在全局段中会报错
[root@localhost nginx]# vim /etc/nginx/nginx.conf
proxy_cache_path /data/ levels=2:1:1 keys_zone=procache:10m;
2.引用缓存
又回到nap.conf文件中,引用刚才定义的缓存,修改到.php$的location段,加入以下内容
proxy_cache procache; #应用主配置文件中定义的缓存,procache是在主配文件中定义的缓存区域名字
proxy_cache_valid 200 301 302 1h; #设置响应码的缓存时间
proxy_cache_use_stale timeout; #设置后端服务器发生什么错误时缓存还能继续使用。
proxy_cache_methods GET HEAD; #设置哪种请求方法才使用缓存。
检查语法并重载配置文件
[root@localhost nginx]# nginx -t
[root@localhost nginx]# nginx -s reload
3.验证
在浏览器中访问http://172.16.200.102/index.php,多访问两次,然后查看定义的目录中有没有生成子目录,生成证明缓存成功:
[root@localhost nginx]# tree /data/
[root@localhost nginx]# tree /data
/data
├── 59
│ └── f
│ └── b
│ └── 49bbcf840980a010f6e71e9fb70bbf59
├── 6b
│ └── 7
│ └── e
│ └── 9265fb1fcece376063e2b462a4c7e76b
└── 8e
└── e
└── 1
└── d19be2f40be92a1508d8bd9f56271e8e
缓存成功
调度,负载均衡
nginx 可以使用两种调度方式:
- 一种是7层调度,原理也是代理的原理,不过就是将功能相同的一类后端主机设置成一个组,然后将请求报文发送至这个组。组内就定义有调度算法,再去调度至某一个节点。
- 另一种就是像lvs一样的4层调度,通过ip加端口直接转发请求,这种调度不能识别7层数据包,所以不能再去通过URL等方式去调度了,功能相对单一。但是由于是4层调度,所以各种TCP协议的数据包都可以通过这个功能来转发了。
7层调度
7层调度的功能还是通过http方式,所以是定义再http上下文中的,需要先定义再去使用:
1.实验环境:调度器172.16.200.102,后端服务器172.16.200.104和172.16.200.105。后端服务器都安装httpd
2.定义
到主配置文件/etc/nginx/nginx.conf中,再http上下文中添加如下内容
upstream app {
server 172.16.200.104 weight=1 max_fails=5 fail_timeo
ut=5s; server 172.16.200.105 weight=1 max_fails=5 fail_timeo
ut=5s; }
}
3.调用
在nap.conf文件中location段中将proxy_pass 后将URL中的ip地址设置为主配置文件中定义的分组名称
location ~* \.php$ {
proxy_pass http://app;
....
}
4.在172.16.200.104和172.16.200.105中添加测试文件
[root@localhost html]# echo "172.16.200.104" > /var/www/html/i
ndex.php #104主机中添加
[root@localhost html]# echo "172.16.200.105" > /var/www/html/i
ndex.php #105主机中添加
5.测试
用浏览器访问172.16.200.102,不断刷新,或者写一个简单的for循环for i in {1..10};do curl 172.16.200.102;done
就获取到172.16.200.104和105两个地址,交替出现,因为默认为rr模式,我们也没有给权重。
4层调度
4层调度是在主配置文件中stream{}上下文中定义的,和7层相似,先将功能相同的主机分成一个组,在组中指定算法,然后在server中将监听的端口指定,就可以转发了,我们这里转发ssh协议:
1.环境:调度器172.16.200.102,后端主机172.16.200.104和172.16.200.105
2.定义
在主配置文件/etc/nginx/nginx.conf中添加stream上下文,在stream上下文中定义
stream {
upstream sshsrv {
server 172.16.200.104:22;
server 172.16.200.105:22;
}
}
3.调用
在定义段下面直接调用,添加以下内容
server {
listen 22;
proxy_pass sshsrv;
}
4.关闭sshd服务
172.16.200.102监听20端口,但是sshd服务是开机默认启动的,所以要先关闭原本的sshd服务,不然就会冲突(或者将listen改为别的端口,然后ssh连接时指定端口也可以)
[root@localhost nginx]# service sshd stop
然后检测配置文件,重载配置文件
[root@localhost nginx]# nginx -t
[root@localhost nginx]# nginx -s reload
5.验证
使用一台客户端,用ssh 172.16.200.102
连接,上去之后ip a
查看Ip地址,可以看到当前地址为172.16.200.104,exit退出后再次连接,看到ip为172.16.200.105,证明实验成功