nginx详解

Nginx是一款<strong>轻量级高性能的http和反向代理服务器</strong>,并且还是一个<strong>邮件代理服务器</strong>。

Nginx与apache的区别
    1.Nginx默认是<strong>异步单进程非阻塞工作模式</strong>,一个进程连接多个线程,一个线程对应一个请求连接,采用<strong>epoll(事件驱动)IO模型</strong>,占用资源少,高性能高并发,最大可支持50000个并发连接。;apache是<strong>同步多进程阻塞型工作模式</strong>,采用<strong>select标准IO模型</strong>,一个进程对应一个请求连接,处理并发请求效果较差。
    2.Nginx具有<strong>内置的健康检查模块</strong>,可以通过加载内置模块<strong>对后端服务器进行健康检查</strong>,达到<strong>负载均衡</strong>的效果。
    3.Nginx<strong>静态页面处理效果比apache强</strong>,但其动态页面处理不如apache,原因是<strong>nginx与php的连接比较简单,可以使用fastcgi软件改善</strong>。
    4.Nginx具有高可用性,支持<strong>热部署</strong>,启动速度迅速,可以在不间断服务的状态下,对软件版本进行升级。
    5.Nginx所有模块都<strong>支持静态编译</strong>,而<strong>apache所有模块支持动静态编译</strong>。
    6.Apache的<strong>rewrite模块功能较nginx强大</strong>。
    7.Nginx的<strong>配置比较简单,代码简洁</strong>;apache配置比较复杂,模块的配置文件比较分散。

Nginx模块
Nginx由<strong>内核和模块</strong>组成。
    内核的功能主要是通过查找配置文件将客户请求映射到一个location模块上(location是nginx的一个模块,用于URL匹配),根据location模块中配置的指令去启动不同的模块完成请求响应
    模块:

结构上:核心模块(http模块(处理请求时调用响应的模块指令处理);Main模块(定义全局设置);event模块(定义IO工作模式和服务器可连接的最大连接数));
                  基础模块(http access模块(http访问控制模块);http fastcgi模块(允许nginx同FastCGI协同工作,并且控制参数被安全传递);http  proxy模块(代理模块,用于转发请求));
                  第三方模块(http upstream request hash模块(设置负载均衡);Notice模块(指定日志输出级别);http access key模块(用于限制某些客户端的访问))。
        功能上:handlers模块:直接处理请求,并对输出内容进行修改,一般只有一个。
                     Filters模块:主要对其他处理器模块输出内容进行修改,最后由nginx输出。
                     Proxies模块:主要与后端服务器进行交互,实现代理和负载均 衡功能。

Nginx工作原理:
请求过程:客户端——》nginx内核(选择处理器模块)——》handlers模块(生成处理结果)——》filters模块(处理修改处理结果)——》nginx响应请求——》客户端。
数据包流向:
客户端(请求数据包)——》nginx服务器——》七层,逐层传递数据包——》处理器——》七层,逐层传递——》nginx服务器——》客户端

Nginx安装
软件:nginx-1.8.0.tar.gz
依赖性软件:gcc gcc-c++(设置编译环境) zlib-devel pcre-devel(支持nginx的http rewrite功能) openssl-devel(支持http ssl模块)
解压,编译,安装:
# tar zxf nginx-1.8.0.tar.gz
# /root/nginx-1.8.0/configure
--prefix=/usr/local/nginx ##nginx安装目录
--with-http_stub_status_module ##监控nginx状态模块
--with-http_ssl_module ##加密认证模块
## make &amp;&amp; make install
设置nginx启动命令
# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
开启ngixn服务:
# nginx
查看默认开启端口:
# netstat -anutpl
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3410/nginx
查看nginx目录大小:
# du -sh /usr/local/nginx
5.3M /usr/local/nginx
查看本地站点信息
# curl -I localhost
HTTP/1.1 200 OK ##http请求返回状态及http版本
Server: nginx ##nginx版本信息(已经隐藏版本)
Date: Sat, 16 Apr 2016 11:07:09 GMT ##(请求时间)
Content-Type: text/html ##文本格式为text/html
Content-Length: 612 ##文本长度
Last-Modified: Fri, 15 Apr 2016 09:08:03 GMT ##nginx安装时间
Connection: keep-alive ##连接状态
ETag: "5710af73-264"
Accept-Ranges: bytes
检测:
浏览器“172.25.48.10”,结果显示nginx的主页面,表明访问成功。

Nginx编译优化(在编译过程前或者编译过程中进行)
   1.站点信息优化
     # curl -I localhost
       Server: nginx/1.8.0
     # vim /root/nginx-1.8.0/src/core/nginx.h
       #define NGINX_VER          "nginx"     ##删除版本信息
   检测:
     # curl -I localhost
        Server: nginx     ##隐藏Nginx版本信息
  2.目录编译优化
    原理:在编译nginx时,默认以debug模式(输出级别)进行,而在debug模式下,会插入很多跟踪和ASSERT之类的信息,在编译前取消nginx
           的debug模式,会极大减少nginx的占用资源。
    # du -sh /usr/local/nginx
      5.3M    /usr/local/nginx
    # vim /root/nginx-1.8.0/auto/cc/gcc
      #debug                           ##注释debug,可缩小nginx目录所占内存
      #CFLAGS="$CFLAGS -g"
    # du -sh /usr/local/nginx
      848k    /usr/local/nginx
  3.cpu编译类型优化
    原理:编译nginx时,默认的GCC参数时“-O”。
   查看cpu类型
    # cat /proc/cpuinfo | grep "model name"
      model name    : QEMU Virtual CPU version 1.5.3
     本机cpu为QEMU内型。
   编译时加上以下参数:
    --with-cc-opt=’-O3’
    --with-cpu-opt=CPU

Nginx配置案例
  1.设置nginx用户
    # groupadd -g 48 nginx
    # useradd -u 48 -g 48 -s /sbin/nologin -d /usr/local/lnmp/nginx -M nginx
    # id nginx    ##查看nginx用户信息
      uid=48(nginx) gid=48(nginx) groups=48(nginx)
    # vim /usr/local/lnmp/nginx/conf/nginx.conf
       user nginx      ## 指定nginx用户
       Worker_processes 1|2      ##1|2为系统cpu数
       events {       ##event模块,指定IO的工作模式
  use epoll;      ##事件模型
  worker_connections  1024;
  }
   # nginx -t      ##检测配置是否正确
   # nginx -s reload     ##重新加载nginx

 2.添加https认证
   # cd /etc/pki/tls/certs/
   # make nginx.pem    ##生成ssl证书
     Country Name (2 letter code) [XX]:CN      ##国家
     State or Province Name (full name) []:Shaanxi     ##省份
     Locality Name (eg, city) [Default City]:xi‘an       ##城市
     Organization Name (eg, company) [Default Company Ltd]:westos     ##组织
     Organizational Unit Name (eg, section) []:linux       ##单位
     Common Name (eg, your name or your server‘s hostname) []:vm4.example.com    ##主机
     Email Address []:[email protected]        ##管理员邮箱
   # mv nginx.pem /usr/local/lnmp/nginx/conf/      ##将证书移至nginx的配置目录下
   # cd /usr/local/lnmp/nginx/conf/
   # vim nginx.conf
     http {
      server {
             listen       443 ssl;         ##默认开启端口为443
             server_name  localhost;      ##服务器名称
             ssl_certificate      nginx.pem;     ## 认证文件  
             ssl_certificate_key  nginx.pem;     ##认证密钥文件
             ssl_session_cache    shared:SSL:1m;     ##session保持时长
             ssl_session_timeout  5m;                 ##session超时时长
             ssl_ciphers  HI504 Gateway TimeoutGH:!aNULL:!MD5;     ##加密方式
             ssl_prefer_server_ciphers  on;
               location / {                        ##URL模块
                              root   html;         ##默认发布目录
                            index  index.html index.htm;     ##默认人发布主页格式
                    }
             }
          }
    # nginx -t
    # nginx -s reload
     打开浏览器,输入"https://172.25.48.10",j进入,会显示没有认证,认证完后,显示nginx主页则表明访问成功。

 3.添加虚拟主机
   首先要将虚拟主机在物理主机上解析。
   # vim /etc/hosts
     172.25.48.10  www.haha.com www.heihei.com  www.linux.com
   进入服务主机,设置nginx虚拟主机。
   # vim /usr/local/lnmp/nginx/conf/nginx.conf
     http {
      server {
               listen  80;      ##默认端口为80;
               server_name www.haha.com;  ##指定主机域名
               location / {
                           root    /www;    ##定义网站的发布目录
                          index   index.html;
                    }
              }
          }
   # nginx -t ##检测nginx语法
   # nginx -s reload
   建立虚拟主机默认发布目录,并设置发布主页
   # mkdir /www
   # cd /www
   # vim index.html
     vm10.example.com
   打开浏览器,输入www.haha.com查看,结果显示:
    vm10.example.com
   表示设置正确,访问成功。

4.Nginx做负载均衡
     # vim /usr/local/lnmp/nginx/conf/nginx.conf
        http {
                upstream westos {       ##upstream负载均衡函数,默认为轮循模式
                     server 172.25.48.4:80;    
                     server 172.25.48.7:80;
                    }
         server {
                   listen 80;     ##监听80端口
                 server_name www.heihei.com;     ##指定网站
                location / {
                    proxy_pass http://westos;  ##反向代理到负载均衡器westos上。
                     }
               }
           }
    # nginx -t
    # nginx -s reload
    结果验证
       打开虚拟机172.25.48.10(desktop.example.com)和主机172.25.254.48 (www.zhuji.com)做负载均衡器,并且都下载http服务,并且分别在两个主机的Apache默认发布目录编写index.html主页。
    # yum install httpd -y
    # /etc/init.d/httpd start
    # cd /var/www/html
    # vim index.html
      desktop.example.com     ##172.25.48.7主机
      www.zhuji.com     ##172.25.48.4主机
    打开浏览器,输入“www.qq.com”,不停按f5查看结果。结果会不停在desktop.example.com和www.zhuji.com之间重复出现,表明负载均
    衡成功。
 
 5.Nginx的负载均衡模块支持四种调度算法:
    1.轮循(Nginx默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器中某台服务器挂掉,系统会自动剔除故障服务器,是用户访问不受影响。
    2.weight轮询权值,weight权值越大,分配到的访问机率越高,主要用于后端服务器性能不均的情况下。
    3.ip_hash,每个请求按照访问ip的hash算法结果分配,可以实现来自东一个ip的客户端请求固定到同一台后端服务器,可以解决动态网页存在的session共享问题,。
    4.第三方调度算法
     (1).fair,较智能,可以根据页面大小和加载时间长短进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间段的服务器优先分配。<strong>nginx本身不支持fair算法,需要下载nginx的upstream_fair模块即可</strong>。
     (2).url_hash,按照访问的url的hash结果分配请求使每个url定向到后端同一个服务器,可以进一步提高后端缓存服务器的效率。需要安 装nginx的hash软件包。
 
 6.Nginx的server模块支持设定后端服务器的状态。
   1.down,表示当前的server不参与负载均衡,但服务器状态正常,只是不会被分配到任何请求。
   2.backup,与刘的备份机器,当其他所有的非backup服务器出现故障或者忙的时候,backup服务器才会处理请求。
   3.max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
   4.fail_timeout,在经历了max_fails次失败后,暂停服务的时间。mail_fials和max_timeout可以结合使用。

7.Nginx的status状态监控模块
   stubstatus模块能够获取nginx自上次启动以来的工作状态,非核心模块,需要在编译过程中编译此模块。“--with-http_stub_status_module”.
   功能:可以检测某一时间段内服务器被访问的次数,以此来判断服务器的并发量。
   # vim /usr/local/lnmp/nginx/conf/nginx.conf
      http {
        server{
            listen       80;
            server_name  172.25.48.10;
           location /status {
                           stub_status on;      ##激活状态
                        access_log off;     ##日志接收关闭
                             }
              }
           }
  # nginx -t
  # nginx -s reload
  打开浏览器,输入“172.25.48.9/status”,查看结果显示,并且用f5刷新,每刷新一次,访问值增加1.结果显示:
     Active connections: 1
     server accepts handled requests
      10 10 126
     Reading: 0 Writing: 1 Waiting: 0

8.Nginx重写模块
     功能:在同一个公司内,会存在不同的公司主页网址。客户可以通过相同的网址访问不同的主页。
     # vim /usr/local/lnmp/nginx/conf/nginx.conf
        http {
         server{
                   listen    80;
                   server_name      172.25.48.10;
              location / {
                root   html;
                index  index.html index.htm;
                rewrite ^(/.*)$ http://172.25.48.7;##将所有在浏览器上输入的网址全部重定向到http://172.25.48.7主页上。
             }
         }
       }
      # nginx -t
      # nginx -s reload
      打开浏览器,输入:172.25.48.10,均定向到“http://172.25.48.7”上面。

 9.Nginx反向代理模块
    功能:nginx做反向代理器,后台多个主机分别充当不同功能的服务器,达到数据有序存放的目的。
    # vim /usr/local/lnmp/nginx/conf/nginx.conf
         http {
             server {
                      listen   80;
                      server_name     172.25.48.10;
               #location /bbs {
                          #   proxy_pass   http://172.25.48.7/bbs;  ##反向代理到其他主机的默认发布目录。
                              #}
                  location ~ ^/bbs {    ##正则表达式,当使用正则表达式时,则反向代理所指定的网址不需要指定目录。
                                  proxy_pass   http://172.25.48.7;
                                 }
                   }
            }
    # nginx -t
    # nginx -s reload
    在172.25.48.7主机中的nginx默认发布目录/var/www//html中建立bbs目录。在bbs目录中建立网页index.html.
    # mkdir -p /var/www/html/bbs
    # vim /var/www/html/bbs/index.html
       bbs.site server3.example.com
     打开浏览器,输入“172.25.48.10/bbs”,结果会显示172.25.48.7主机/var/www/html/bbs/index.html中的网页内容。
 
10.Nginx缓存机制+负载均衡
    功能:当出现高并发访问时,利用此机制可以减小后台压力,在一定时间内,客户可以通过访问缓存来达到诉求。
    级别:level级别 = 1:2   ##1表示一级目录,为一个字符。2表示2级目录,为两个字符。最多为三层目录。定义目录。
    Keys_zone=one:10m    ##定义一个缓存文件区域大小。
    max_size=512m;    ##设置缓存最大值为512m。
    # mkdir -p /dev/shm/nginx/cache   ##建立系统缓存目录。
    # vim /etc/rc.local  ##此脚本在系统开机时会自动执行,将建立缓存目录命令行写入此目录中,则会在系统开机时自动建立系统缓存目录。
      mkdir -p /dev/shm/nginx/cache
    # vim /usr/local/lnmp/nginx/conf/nginx.conf
      http {
           upstream westos {    ##负载均衡
                     server 172.25.48.7:80;   ##nginx轮循规则
                     server 172.25.48.4:80;
                }
        ##cache缓存机制,分别指定
           proxy_cache_path    /dev/shm/nginx/cache    levels=1:2     keys_zone=one:10m     max_size=512m;
           add_header X-Cache $upstream_cache_status;
        server {
             listen       80;
              server_name  www.heihei.com;
            location / {    ##正则表达式指定路径
                  proxy_pass   http://redhat;   ##westos为负载均衡名称,与upstream对应。
                  proxy_cache one; ##指定缓存区域,与keys_zone对应。
                  proxy_cache_valid 200 10s;    ##指定缓存时间,超过缓存时间,缓存失效,请求重新从后端获取数据,200是http的状态
                                                    码,表示正确。100表示静态界面,300表示重定向。
                  }
              }
         }
   # nginx -t
   # nginx -s reload
   分别在172.25.48.7和172.25.48.4主机的nginx的默认发布目录/var/www/html目录中分别建立网页,打开浏览器,输入“www.heihei.com”,
   不停按f5,每隔10s,结果会在vm7.example.com和vm7.example.com之间变换,并且会在/dev/shm/nginx/cache目录中产生大量缓存文件。
   并且不间断执行“curl -I localhost”命令会出现以下结果:
   # curl -I localhost
      HTTP/1.1 200 OK
      Server: nginx
      X-Cache: EXPIRED    ##表示缓存已经失效,此次访问是直接访问后台。
      立刻再次执行,会出现以下结果;
   # curl -I localhost
      HTTP/1.1 200 OK
      Server: nginx
      X-Cache: HIT    ##表示此次访问是访问缓存,而不是直接访问后台.

时间: 2024-10-15 18:59:25

nginx详解的相关文章

【转】Web服务器之Nginx详解(理论部分)

大纲 一.前言 二.Web服务器提供服务的方式 三.多进程.多线程.异步模式的对比 四.Web 服务请求过程 五.Linux I/O 模型 六.Linux I/O 模型具体说明 七.Linux I/O模型的具体实现 八.Apache 的工作模式 九.支持高并发的Web服务器 十.Nginx 详解 一.前言 注,在说Web服务器之前,先说说线程.进程.以及并发连接数. 1.进程与线程 进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.从逻辑

Nginx 详解 (二)

13.反向代理模块   (1).常用指令: l  proxy_connect_timeout:nginx将一个请求发送至upstream server之前等待的最大时长: l  proxy_cookie_domain:将upstreamserver通过Set-Cookie首部设定的domain属性修改为指定的值,其值可以为一个字符串.正则表达式的模式或一个引用的变量: l  proxy_cookie_path: 将upstream server通过Set-Cookie首部设定的path属性修改为

nginx详解及配置

Nginx特性:     模块化设计.较好的扩展性:       高可靠       master --> worker       低内存消耗       10000个keep-alive模式下的connection,仅需要2.5MB的内存:       支持热部署       不停机而更新配置文件.日志文件滚动.升级程序版本: 支持事件驱动.AIO.mmap: 基本功能:      静态资源的web服务器,能缓存打开的文件描述符:       http.smtp.pop3协议的反向代理服务器

第十四章 nginx详解

14.1 nginx简介 Nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行. Nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用. 第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2011年6月1日,nginx 1.0.4

Nginx详解(二)操作

一.前言二.Nginx安装三.Nginx的配置文件详解四.nginx配置之http段五.其他模块六.实验 一.前言http://www.nginx.cn/doc/  nginx安装等各个操作界面介绍Nginx主要实现两个功能:Web服务器和反向代理Nginx的模块类型:    核心模块:core module    标准模块:        Stanard HTTP modules        Optional HTTP modules        Mail modules    第三方模块

nginx详解反向代理、负载均衡、LNMP架构上线动态网站

nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了.Igor Sysoev在建立的项目时,使用基于BSD许可. nginx和apache区别 Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更

Nginx详解-服务器集群

Nginx是什么 代理服务器:一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器.  一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接.或者获得目标服务器的指定资源. Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演“中间人”的角色.HTTP的代理服务器即是Web服务器又是Web客户端. 代理服务器是介于

Nginx详解-服务器集群(转载)

Nginx是什么 代理服务器:一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器.  一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接.或者获得目标服务器的指定资源. Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演"中间人"的角色.HTTP的代理服务器即是Web服务器又是Web客户端. 代理服

Nginx详解(正向代理、反向代理、负载均衡原理)

nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现. 这里主要通过三个方面简单介绍nginx 反向代理 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先我们要明确一个概念,所谓代理就是一个代表.一个渠道: 此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问