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:\nginx
        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
-----------------------------------------------------------------------------------

时间: 2024-10-10 02:03:00

Nginx(一)的相关文章

linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表里 面找master进程,它的编号就是主进程号. ps -ef | grep nginx 查看进程 cat /usr/local/nginx/nginx.pid 每次修改完nginx文件都要重新加载配置文件linux命令: /usr/local/nginx -t //验证配置文件是否合法 若ngin

shell 格式化输出nginx的编译参数

命令 nginx -V > nginx.txt cat -n nginx.txt  | sed -n '5,18p' | awk '{$1="";print $0}'  | sed 's/^[ ]*//g'  | tr '\n' ',' | sed -n 's/,//gp' | tr " " "\n" 结果 configure arguments: --user=nginx --group=nginx --prefix=/usr/share

Nginx 反代参数:$X-Real-Ip和$X-Forwarded-For的区别

## \$X-Real-Ip和$X-Forwarded-For的区别 标签(空格分隔): nignx 负载均衡 client-ip --- ####1.如果只有一层代理,这两个头的值就是一样的####2.多层代理> * X-Forwarded-For:  header包含这样一行        `*X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3*`> * X-Real-Ip:没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况`// 最

Nginx为什么比Apache Httpd高效:原理篇

一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器.程序 本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例.若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循 序)或异步(平行)的方式独立运行.现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借

linux 安装与启动nginx

linux系统为Centos 64位 一.去http://nginx.org/download/上下载相应的版本下载nginx-1.8.0.tar.gz(注:还有更高版本的). 二.解压 tar -zxvf nginx-1.8.0.tar.gz 三.进入nginx-1.8.0/文件夹,设置一下配置信息 ./configure --prefix=/usr/local/nginx(安装后的文件存放路径). 四.配置的时候可能会出现类似这样的信息 ./configure: error: the HTT

linux运维、架构之路-Nginx提高

一.虚拟主机搭建 1.基于域名的虚拟主机 [[email protected] html]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name

linux自学笔记--nginx基本配置

1.基本配置 worker_processes auto|3; 指定使用的核数,默认auto,也可指定  一般为自身核数-1,可用lscpu查看 events { worker_connections 1024; 最大并发连接数,最大并发响应  数 worker_processes * worker_connections } http { keepalived_timeout 65 0表示禁止长连接 keepalived_request 长连接最大资源数,默认100 keepalived_di

nginx配置文件详解

nginx配置文件nginx.conf超详细讲解 #nginx进程,一般设置为和cpu核数一样worker_processes 4;                        #错误日志存放目录 error_log  /data1/logs/error.log  crit;  #运行用户,默认即是nginx,可不设置user nginx       #进程pid存放位置pid        /application/nginx/nginx.pid; #Specifies the value

Saltstack批量编译部署nginx(多模块)

最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环境使用,这就需要用到saltstack的批量安装部署功能了.这篇文章主要介绍nginx的批量部署,下篇讲解tomcat多实例的批量部署方法. 环境介绍: Centos 6.5 salt 2015.5.10 nginx 1.12.0 minion:test 1.修改master配置文件,修改后重启服务

FastDFS+Nginx问题及修复

FastDFS+nginx问题及修复:     1.[error] 30000#0: *1 open() "/usr/local/nginx/html/group1/M00/00 /00/wKgAA1cLh12AI0kfAAAADzbdjmQ50_big.html           "failed (2: No such file or directory), client: 192.168.0.181, server:localhost, request:            &