Nginx(一)

一、简介
  Web服务器:
    1.Apache:仍然是世界上用得最多的Web服务器。优势:源代码开放、有一支开放的开发队伍、支持跨平台(可运行在几乎所有的Unix、Windows、Linux系统上),可移植性等。属于重量级产品,所消耗的内存比其他服务器高。
    2.Lighttpd:德国人写的开源原件。优点:内存开销低、CPU占用率低、效能好、模块丰富等特点。支持FastCGI、CGI、Auth、输出压缩、URL重写及Alias等重要功能。轻量级Web服务器。
    3.Tomcat:开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。实行了Apache-Jakarta规范,但是对静态文件、高并发处理较弱。
    4.IBM WebSphere:基于Java的应用环境建立、部署、管理Internet和Web应用程序
    5.Microsoft IIS:微软,IIS提供图形界面的管理工具,可用于监视配置和控制Internet服务。只能运行在Microsoft Windows平台、Linux/Unix平台上,需要购买商业Windows Server操作系统。
    6.Nginx:俄罗斯人Igor Sysoev编写的一款HTTP和反向代理服务器。在高并发情况下,Nginx是Apache服务器不错的替代品,能支持高达50000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。
  Nginx的优势:
    1.支持高并发连接:官测5万并发,实产2~4万并发。这得益于Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freebsd)网络I/O模型,而Apache使用的则是传统的select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU等服务器资源要比Nginx高得多。在处理大量连接的读写,Apache所采用的select网络I/O模型非常低效。
    2.内存消耗少:Nginx+PHP(FastCGI)服务器在3万并发连接下,总消耗不到2GB内存。Nginx+PHP5(FastCGI)服务器处理PHP动态程序能力超过“700次请求/秒”,相当于每天承受6000万访问量。
    3.成本低廉:购买硬件负载均衡交换机需要十几万甚至几十万RMB,而Nginx为开源软件,采用2-clause BSD-like协议,可以免费使用,并且可用于商业用途。
    4.其他优点:
      a.配置文件非常简单
      b.支持Rewrite重写规则
      c.内置的健康检查功能
      d.节省带宽
      e.稳定性高
      f.支持热部署
  总结:Nginx在反向代理、Rewrite规则、稳定性、静态文件处理、内存消耗等方面都表现出很强的优势。


二、Nginx服务器的安装与配置
  Windows版:
    官网下载完成后,解压缩到一个不包含空格的路径中,执行nginx.exe即可。Windows版本的Nginx性能要比Linux/Unix版本Nginx差很多。
  Linux版:
    安装Nginx服务器之前,要安装一个Linux/Unix操作系统发行版(CentOS-6.3)
    CentOS完全免费,修正了RedHat的很多BUG,但是CentOS不向用户提供技术支持,也不服任何商业责任。
    (1)编译Nginx的要求:
      1> 磁盘空间:需要保证有10MB以上的剩余磁盘空间。
      2> GCC编译器及相关工具:#yum -y install gcc gcc-C++ autoconf automake
      3> 模块依赖性:Nginx的一些模块需要其他第三方库的支持:#yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
    (2)Nginx下载:
      http://www.nginx.net/网站
    (3)Nginx安装:
      1> Windows下安装:下载压缩包,解压到一个不包含空格的路径中,然后在"开始"->"运行"->"cmd"中执行DOS命令即可启动Nginx:
        d:
        cd d: ginx
        start nginx
        如果要对Nginx进程进行控制,可使用DOS命令:nginx -s [stop | quit | reopen | reload]
      2> Linux环境下安装:
        #tar -zxvf nginx-0.x.xx.tar.gz
        #cd nginx-0.x.xx
        #./configure
        #make
        #sudo make install
        默认会装在/usr/local/nginx目录下

    (4)Nginx的启动、停止
      1> 启动
        /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
        参数"-c"指定了配置文件的路径,如果不加"-c"参数,Nginx会默认加载器安装目录的conf子目录中的nginx.conf文件
      2> 停止
        Nginx停止方法很多,一般通过发送系统型号给Nginx主进程的方式来停止Nginx
        查找Nginx的主进程号:#ps -ef | grep nginx
        一个Nginx进程的备注信息为"master process"表示为主进程,它的进程号为主进程号
        a.从容停止Nginx
          #kill -QUIT Nginx 主进程号
          或
          #kill -QUIT `/usr/local/webserver/nginx/logs/nginx.pid`
        b.快速停止Nginx
          #kill -TERM Nginx 主进程号
          #kill -TERM `/usr/local/webserver/nginx/logs/nginx.pid`
          或
          #kill -INT Nginx 主进程号
          #kill -INT `/usr/local/webserver/nginx/logs/nginx.pid`
        c.强制停止所有Nginx进程
          #pkill -9 nginx
    (5)Nginx的平滑重启
      如果改变Nginx的配置文件(nginx.conf)想要重启Nginx同样可以通过发送系统信号给Nginx主进程的方式来进行。重启之前,要确认Nginx配置文件语法是否正确:        

          #/usr/local/webserver/nginx/sbin/nginx -t -c
          #/usr/local/webserver/nginx/conf/nginx.conf
      如果配置不正确会提示第几行出错,正确会显示两行提示信息。
      正确了就可以平滑重启Nginx了:
        #kill -HUP Nginx 主进程号
        #kill -HUP `/usr/local/webserver/nginx/logs/nginx.pid`
    (6)Nginx的信号控制
      支持以下几种信号:
        TERM,INT      快速关闭
        QUIT         从容关闭
        HUP          平滑重启
        USR1        重新打开日志文件,在切割日志时用途较大
        USR2        平滑升级可执行程序
        WINCH      从容关闭工作进程
三、Nginx的基本配置与优化
  1.Nginx的完整配置示例(Page45~Page47)
    Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf

  2.Nginx的虚拟主机配置
    在Nginx配置文件(nginx.conf)中,一个最简化的虚拟主机配置:
----------------------------------------------------------------------------
http
{
  server
  {
    listen 80 default;
    server_name _ *;
    access_log logs/default.access.log combined;
    location / {
    index index.html index.php;
    root /data0/htdocs/htdocs;
    }
  }
}
---------------------------------------------------------------------------
跟Apache一样,Nginx也可以配置多种类型的虚拟主机:一是基于IP的虚拟主机,二是基于域名的虚拟主机,三是基于端口的虚拟主机

  I.配置基于IP的虚拟主机
    Linux、FreeBSD操作系统都允许添加IP别名。IP别名背后的概念:可以在一块物理网卡上绑定多个IP地址。这样就能够在使用单一网卡的同一服务器上运行多个基于IP的虚拟主机。在Linux上,可以使用标准网络配置工具(ifconfig和route命令)添加IP别名。
    本地回环代表设备的本地虚拟接口,所以默认被看做永远不会宕掉的接口。主要作用:①测试本机网络配置,能ping通127.0.0.1说明本机的网卡和IP协议安装都没有问题;②某些SERVER/CLIENT的应用程序在运行时须调用服务器上的资源,一般要指定SERVER的资源装在本机上,SERVER的IP地址设为127.0.0.1也同样可以运行

  在eth0网卡设备上添加两个IP别名192.168.149.132和192.168.149.232可以通过ifconfig和route命令来进行:
    #/sbin/ifconfig eth0:1 192.168.149.132 broadcast 192.168.149.255 netmask 255.255.255.0 up
    #/sbin/route add -host 192.168.149.132 dev eth0:1

    #/sbin/ifconfig eth0:2 192.168.149.232 broadcast 192.168.149.255 netmask 255.255.255.0 up
    #/sbin/route add -host 192.168.149.232 dev eth0:2
  这时候执行ifconfig命令可以看到eth0网卡设备上绑定了两个IP别名,但是重启后会IP别名会消失,也可以通过配置文件设置IP别名,将上面两条ifconfig和route命令添加到/etc/rc.local文件中,让系统开机自动运行。

  接下来在Nginx配置文件(nginx.conf)中,分别对192.168.149.32、192.168.149.132、192.168.149.232三个IP配置三个纯静态HTML支持的虚拟主机。
--------------------------------------------------------------------------
http
{
  #第一个虚拟主机
  server
  {
    #监听的IP和端口
    listen 192.168.149.32:80;
    #主机名称
    server_name 192.168.149.32;
    #访问日志文件存放路径
    access_log logs/server1.access.log combined;
    location /
    {
      #默认首页文件,从左到右
      index index.html index.htm;
      #HTML网页存放目录
      root /data0/htdocs/server1;
    }

  }
}

http
{
  #第二个虚拟主机
  server
  {
    #监听的IP和端口
    listen 192.168.149.132:80;
    #主机名称
    server_name 192.168.149.132;
    #访问日志文件存放路径
    access_log logs/server2.access.log combined;
    location /
    {
      #默认首页文件,从左到右
      index index.html index.htm;
      #HTML网页存放目录
      root /data0/htdocs/server2;
    }

  }
}

http
{
  #第三个虚拟主机
  server
  {
    #监听的IP和端口
    listen 192.168.149.232:80;
    #主机名称
    server_name 192.168.149.232;
    #访问日志文件存放路径
    access_log logs/server3.access.log combined;
    location /
    {
      #默认首页文件,从左到右
      index index.html index.htm;
      #HTML网页存放目录
      root /data0/htdocs/server3;
    }

  }
}
---------------------------------------------------------------------------
  从上面配置可以看出,一段server{....}就是一个虚拟主机,如果配置多个虚拟主机建立多段server{....}配置即可,非常方便。监听端口也可以不写IP地址直写端口,把它配置成"listen 80",则表示监听该服务器上所有IP的80端口,可以通过server_name区分不同的虚拟主机。

  II.配置基于域名的虚拟主机
    基于域名的虚拟主机是最常见得一种虚拟主机。只需要配置你的DNS服务器,将每个主机名映射到正确的IP地址,然后配置Nginx服务器,令其识别不同主机名就可以了。共享IP地址,有效的解决了IP地址不足的问题。如果没有特殊要求必须基于IP虚拟主机,最好使用基于域名的虚拟主机。

    配置三个虚拟主机,第一个aaa.domain.com:表示所有对aaa.domian.com的访问都由它来处理;第二个bbb.otherdomain.com:表示所有对bbb.otherdomain.com的访问都由它来处理;第三个www.domain.com、domain.com,以及除了aaa.domian.com之外的所有*.domian.com二级域名的访问都由它来处理。每个虚拟主机的网页文件分别存放在不同的目录中,每个虚拟主机使用了不同的日志文件来记录访问日志。
----------------------------------------------------------------------------
http
{
  #第一个虚拟主机
  server
  {
    #监听端口
    linsten 80;
    #主机名称
    server_name aaa.domain.com;
    #访问日志文件存放路径
    access_log logs/aaa.domain.com.access.log combined;
    location /
    {
      #默认首页文件,顺序从左到右
      index index.html index.htm
      #HTML网页文件存放的目录
      root /data0/htdocs/aaa.domain.com;
    }
  }
}

http
{
  #第二个虚拟主机
  server
  {
    #监听端口
    linsten 80;
    #主机名称
    server_name bbb.otherdomain.com;
    #访问日志文件存放路径
    access_log logs/bbb.otherdomain.com.access.log combined;
    location /
    {
      #默认首页文件,顺序从左到右
      index index.html index.htm
      #HTML网页文件存放的目录
      root /data0/htdocs/bbb.otherdomain.com;
    }
  }
}

http
{
  #第三个虚拟主机
  server
  {
    #监听端口
    linsten 80;
    #主机名称
    server_name www.domain.com domain.com *.domian.com;
    #访问日志文件存放路径
    access_log logs/www.domain.com.access.log combined;
    location /
    {
      #默认首页文件,顺序从左到右
      index index.html index.htm
      #HTML网页文件存放的目录
      root /data0/htdocs/domain.com;
    }
  }
}
----------------------------------------------------------------------------------
  3.Nginx的日志文件配置与切割
    Nginx访问日志文件配置
    与Nginx日志相关的指令主要有两个:
    log_format用来设置日志的格式
    access_log用来指定日志文件的存放路径、格式和缓存大小。
    两条指令在Nginx配置文件中的位置可以在http{....}之间,也可以在虚拟主机之间,即server{....}两个大括号之间。

  I.log_format
    语法格式:log_format name format [format ...]
    其中name表示定义的格式名称,format表示定义的格式样式。
    log_format有一个默认的、无须设置的combined日志格式设置,相当于Apache的combined日志格式:
      log_format combined '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $body_bytes_sent '
        '"$http_referer" "$http_user_agent"';
  也可以自定义日志记录格式,注意:log_format指令设置的name名称在Nginx配置文件中不能重复。

  Nginx服务器作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,就不能获取到客户端的真实IP地址了。原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端IP,通过$remote_addr变量拿到的是反向代理服务器的IP地址。但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
  log_format combined '$http_x_forwarded_for - $remote_user [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent"';

  II.access_log
    语法格式:access_log path [format [buffer=size | off]]
    其中path表示日志文件的存放路径,format表示使用log_format指令设置日志格式的名称,buffer=size表示设置内存缓冲区的大小
      ①不想记录日子:access_log off;
      ②默认combined格式日志记录:access_log /data1/logs/filename.log;
                  或者access_log /data1/logs/filename.log combined;
      ③自定义日志格式:
        log_format mylogformat '$remote_addr - $remote_user [$time_local] "$request" '
                ' $status $body_bytes_sent "$http_referer" '
                ' "$http_user_agent" $http_x_forwarded_for ';
                access_log /data1/logs/access.log mylogformat buffer=32k;
      ④Nginx 0.7.4之后版本,access_log指令中日志文件路径可以包含变量:
          access_log /data1/logs/$server_name.log combined;
      存在变量的限制:
        a. Nginx进程设置的用户和组必须有对该路径创建文件的权限
        b. 缓冲将不会被使用
        c. 对于每一条日志记录,日志文件都将先打开文件,再写入日志记录,然后马上关闭。
  III. Nginx日志文件的切割
    Nginx不支持像Apache一样使用cronolog来轮转日志,但是可以采用以下方式:
    #mv /data1/logs/access.log /data1/logs/20160715.log
    #kill -USR1 Nginx 主进程号
    首先通过mv重名命日志文件,然后发送kill -USR1信号给Nginx进程号,让Nginx重新生成一个新的日志文件/data1/logs/access.log
    如果想每天切割日志,还须要借助crontab。写一份按天切割的日志,按年、月份目录存放日志的shell脚本
    ------------------------------------------------------------------------
    vim /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
=====================================================
#!/bin/bash
#这个脚本必须每天的00:00运行

#Nginx日志文件的存放路径
logs_path="/data1/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access_$(date -d "yesterday" + "%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
=====================================================
配置crontab每天凌晨00:00定时执行这个脚本:
crontab -e
00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
-----------------------------------------------------------------------------------

原文地址:https://www.cnblogs.com/yexiang520/p/5683161.html