nginx高级用法

一、简介

在功能应用方面,Nginx不但是一个优秀的WEB服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡方面,它还可以实现对后端服务的读写分离,负载均衡方面它类似于LVS以及Haproxy等专业软件,但是Nginx部署起来更为简单、方面,其默认方式RR(轮询)。在缓存服务方面有类似于Squid等专业软件。

二、Nginx的重要特性

(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地址的并发连接或请求数限制。

支持邮件服务代理。

三、实现功能

在此篇博客中,我们将实现以下几个功能:

  1. Nginx的反向代理
  2. 负载均衡
  3. 对请求报文的修改
  4. 缓存机制
  5. 读写分离

(1)Nginx反向代理

        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;
        }

(2)nginx实现负载均衡

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;    
    }

(3)对请求报文的修改

如果对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
        }

修改代理服务器中httpd的日志

[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"

(4)缓存机制

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分钟
        }

#可以在报文中添加缓存命中的情况
在这里插入图片描述
在这里插入图片描述
可以看到在配置文件中添加的提示语

(5)nginx实现读写分离

后端web服务端(httpd)打开上传模块

[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 <Directory "/var/www/html">
 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<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
<p>Resource /passwd has been created.</p>
<hr />
<address>Apache/2.2.15 (Red Hat) Server at 172.25.1.2 Port 80</address>
</body></html>
100  2769  100   258  100  2511  40732   387k --:--:-- --:--:-- --:--:--  408k

#上传文件成功
[root@server2 html]# ls
index.html  passwd

配置nginx

    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;
        }
        }

测试

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值