美文网首页
Nginx几种用法

Nginx几种用法

作者: fengkaipeng | 来源:发表于2017-08-27 19:11 被阅读289次

    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    #编写测试页面,加入以下内容
    <?php
    phpinfo();
    ?>
    

    (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
    <?php
    phpinfo();
    ?>
    

    (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,证明实验成功

    相关文章

      网友评论

          本文标题:Nginx几种用法

          本文链接:https://www.haomeiwen.com/subject/fgejdxtx.html