在功能应用方面,Nginx不但是一个优秀的WEB服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡方面,它还可以实现对后端服务的读写分离,负载均衡方面它类似于LVS以及Haproxy等专业软件,但是Nginx部署起来更为简单、方面,其默认方式RR(轮询)。在缓存服务方面有类似于Squid等专业软件。
(1)基本特性
可针对静态资源高速高并发访问及缓存。
可使用反向代理加速,并且可进行数据缓存。
具有简单负载均衡、节点健康检查和容错功能。
支持远程FastCGI、Uwsgi、SCGI、Memcached Servers的加速和缓存。
支持SSL、TLS、SNI。
具有模块化的构架:过滤器包括gzip压缩、range支持、chunked响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。
(2)www服务特性
支持基于名字、端口及IP的多虚拟主机站点。
支持keep-alive和poplined连接。
可进行简单、方便、灵活的配置和管理。
支持修改Nginx配置,并且在代码上线时,可平滑启动(reload),不中断业务访问。
可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsylog处理日志。
可利用信号控制Nginx进程。
支持3xx-5xx HTTP状态码重定向。
支持rewrite模块,支持URI重写及正则表达式匹配。
支持基于客户端IP地址和HTTP基本认证的访问控制。
支持PUT、DELETE、MKCOL、COPY及MOVE等较特殊的HTTP请求方法。
支持FLV流和MP4流技术产品应用。
支持HTTP相应速率限制。
支持同一IP地址的并发连接或请求数限制。
支持邮件服务代理。
在此篇博客中,我们将实现以下几个功能:
location ~* ^/www {
root /;
proxy_pass http://172.25.1.2;
#将访问172.25.1.1/www的请求转到172.25.1.2/www目录下
}
location / {
root html;
index index.php index.html index.htm; #添加index.php
}
location ~ \.php$ { #将以.php结尾的访问,代理到本机的9000端口,需要安装php
root html;
fastcgi_pass 127.0.0.1:9000; #php的监听端口为9000
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
nginx的负载均衡主要使用upstream模块来实现
upstream webserver { #此模块需要定义在server之外,实现负载均衡,和热备
#ip_hash;
#可以使用ip_hash算法,但是不能打开热备,因为如果热备机提供的是错误无法到达页面,ip_hash可能会将请求定位到热备机器中
server 172.25.1.2 weight=1;
server 172.25.1.3 weight=1;
server 127.0.0.1:8080 backup;
}
关于nginx负载均衡配置的几个状态参数讲解
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
upstream mysvr {
server 172.25.1.2 weight=2 max_fails=2 fail_timeout=2;
server 172.25.1.3 weight=1 max_fails=2 fail_timeout=1;
}
如果对nginx实现了代理功能,在后端代理中查看访问日志,日志中会显示是nginx服务器进行了访问,而不是真实的客户端地址,这会使得我们无法正确统计网站的访问信息,因为需要修改nginx转发的请求报文头部
[root@server2 httpd]# cat access_log
172.25.1.1 - - [13/Feb/2019:22:09:47 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.1 - - [13/Feb/2019:22:09:48 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.1 - - [13/Feb/2019:22:10:00 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.1 - - [13/Feb/2019:22:10:02 +0800] "GET /www HTTP/1.0" 301 307 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"
172.25.1.1 - - [13/Feb/2019:22:10:02 +0800] "GET /www/ HTTP/1.0" 200 16 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"
172.25.1.1 - - [13/Feb/2019:22:10:11 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.1 - - [13/Feb/2019:22:10:13 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
location ~* ^/www {
proxy_pass http://172.25.1.2;
proxy_set_header X-Real-IP $remote_addr; #创建X-Real-IP为后端真实ip
}
[root@server2 httpd]# vim /etc/httpd/conf/httpd.conf
497 LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Ag ent}i\"" combined
#%h修改为%{X-Real-IP}i
[root@server2 httpd]# /etc/init.d/httpd restart #重启httpd
在客户端重新进行访问server1,再次查看server2的日志
172.25.1.1 - - [13/Feb/2019:22:25:22 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:27:01 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:33:49 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:33:49 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:33:49 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:33:50 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
172.25.1.250 - - [13/Feb/2019:22:33:50 +0800] "GET /www HTTP/1.0" 301 307 "-" "curl/7.29.0"
http段中创建缓存
proxy_cache_path /nginx/cache/first levels=1:2 keys_zone=first:20m max_size=1g;
#创建缓存,levels=1:2创建两级缓存第一级1个字符,第二级2个字符,nginx的缓存是存在储存中的
server段中打开缓存
location / {
root html;
index index.php index.html index.htm;
proxy_pass http://webserver; #代理到负载均衡主机
proxy_set_header X-Real-IP $remote_addr; #创建真实头部
proxy_cache first; #打开定义的缓存
proxy_cache_valid 200 10m; #如果返回码是200缓存10分钟
}
#可以在报文中添加缓存命中的情况
可以看到在配置文件中添加的提示语
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
#搜索dav模块查看这两个模块是否开启
177 LoadModule dav_module modules/mod_dav.so
181 LoadModule dav_fs_module modules/mod_dav_fs.so
317
318 Dav on #打开Dav功能
[root@server2 ~]# /etc/init.d/httpd restart
[root@server2 www]# setfacl -m u:apache:rwx /var/www/html/
#普通用户是以apache用户访问,因此对/var/www/html/没有上传权限,因此需要添加权限
[root@foundation1 docs]# curl -T /etc/passwd 172.25.1.2
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
201 Created
Created
Resource /passwd has been created.
Apache/2.2.15 (Red Hat) Server at 172.25.1.2 Port 80
100 2769 100 258 100 2511 40732 387k --:--:-- --:--:-- --:--:-- 408k
#上传文件成功
[root@server2 html]# ls
index.html passwd
server {
listen 80;
server_name localhost;
location / { #正常访问则取访问172.25.1.3,如果是PUT方法则去访问172.25.1.2
proxy_pass http://172.25.1.3;
if ($request_method = 'PUT'){
proxy_pass http://172.25.1.2;
}
}