一步一步学Nginx

【Nginx简介与环境搭建】

     Nginx(发音同engine x),是来自于俄罗斯的高性能web服务器和反向代理服务器。在国内有新浪、网易、豆瓣、迅雷等多家网站使用。

     负载均衡(load balance):使用Nginx作为代理服务器,接收用户请求,并将其“均匀地转发”给多台内部web服务器,不会出现负载集中在某台服务器的现象。

    反向代理(reverse proxy):标准的代理是用户使用代理软件访问互联网上的多台web服务器,而反向代理指的是多个用户使用代理服务器访问多台内部web服务器的模式。

使用Nginx的优点:

     支持高并发访问:在生产环境下支持高达5万以上的并发连接数。

     内存消耗少:在5万并发连接环境下,开启10个worker进程,仅仅消耗150M内存。

     容易配置:配置文件便于学习、阅读。

     成本低廉:Nginx是免费的开源软件,无须付费。

     支持rewrite重写规则:Nginx使用pcre进行正则表达式匹配,根据请求域名、url的不同,将http请求分发给不同的后端服务器。

     内建健康检查功能:Nginx能够检测某台后端服务器是否宕机,不影响用户访问。

     节省带宽:可以对静态资源进行gzip高效压缩,而通常浏览器都具有gzip解压缩功能。

     性能稳定:使用Nginx作为反向代理服务器,有效避免了网络攻击对后端服务器的影响,提高了安全性。

 

【安装Nginx】

一. 安装依赖包:

1. 安装pcre:对正则表达式的支持。

   tar -zxvf pcre-8.33.tar.gz

Shell代码   收藏代码
  1. cd pcre-8.33  
  2. ./configure --prefix=/usr/local/pcre  
  3. make && make install   

 2. 安装zlib:对gzip压缩的支持。    

Shell代码   收藏代码
  1. tar -zxvf zlib-1.2.8.tar.gz  
  2. cd zlib-1.2.8  
  3. ./configure --prefix=/usr/local/zlib  
  4. make && make install   

 3. 安装openssl:对ssl协议的支持。 

Shell代码   收藏代码
  1. tar -zxvf openssl-1.0.0.tar.gz   
  2. cd openssl-1.0.0  
  3. ./config --prefix=/usr/local/openssl  
  4. make && make install   

 二. 安装Nginx:

 1. 创建日志目录: 

Shell代码   收藏代码
  1. mkdir -p /opt/nginx/logs  

 2. 解压、配置: 

Shell代码   收藏代码
  1. tar -zxvf nginx-1.6.0.tar.gz  
  2. cd nginx-1.6.0  
  3. ./configure --prefix=/usr/local/nginx \  
  4. --error-log-path=/opt/nginx/logs/error.log \  
  5. --http-log-path=/opt/nginx/logs/access.log \  
  6. --with-pcre=/software/pcre-8.33 \  
  7. --with-zlib=/software/zlib-1.2.8 \  
  8. --with-http_ssl_module \  
  9. --with-openssl=/software/openssl-1.0.0 \  
  10. --with-http_stub_status_module \  
  11. --with-http_realip_module \  
  12. --with-http_gzip_static_module \  
  13. --without-http_fastcgi_module \  
  14. --without-http_memcached_module \  
  15. --without-http_map_module \  
  16. --without-http_geo_module \  
  17. --without-http_autoindex_module \  
  18. --with-poll_module  

说明:

     1. 使用\:表示多个物理行同属一个逻辑行.

     2. 日志文件:error.log存放Nginx的错误日志,access.log存放用户访问日志.

     3. 依赖关系:pcre、zlib、openssl需要设置为源码位置,而不是安装位置.

3. 编译、安装: 

Shell代码   收藏代码
  1. make && make install  

  

【最小配置】

1. 修改Nginx启动端口号:修改监听端口号为8080,因为只有root账号能够使用0-1024之间的端口号. 

Shell代码   收藏代码
  1. vi /usr/local/nginx/conf/nginx.conf  
  2. listen       8080;  

2. 防火墙设置:开放8080端口 

Shell代码   收藏代码
  1. su - root  
  2. vi /etc/sysconfig/iptables  

 追加如下内容:

Shell代码   收藏代码
  1. -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  

 重启网卡: 

Shell代码   收藏代码
  1. service iptables restart  

 

【启动、关闭】

1. 启动nginx:并指定配置文件,参数-c为configure 

Shell代码   收藏代码
  1. /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  

 2. 关闭nginx:参数-s为signal 

Shell代码   收藏代码
  1. #等待worker进程处理完用户的当前请求,再进行关闭  
  2. /usr/local/nginx/sbin/nginx -s quit  
  3. #快速关闭  
  4. /usr/local/nginx/sbin/nginx -s stop  

 3. 使用kill命令关闭:关闭主进程(master process),从进程(worker process)随之消亡.

Shell代码   收藏代码
  1. ps -ef | grep nginx  
  2. kill 21531  



2.Nginx的基本配置

对Nginx的配置文件nginx.conf的常用配置做详细的解释,并且以附件的形式给出实际的配置文件内容。

   

Shell代码   收藏代码
  1. user  nick excelsoft;  

      说明:以root账号运行时,设置worker进程所属的用户/组。

 

Shell代码   收藏代码
  1. worker_processes  2;  

      说明:设置worker进程的数目,一般和CPU内核数一致,可设置为其2倍,以优化性能。
  其他:
    查看CPU内核数:cat /proc/cpuinfo | grep processor
   如果为双核,则显示:
      processor : 0
      processor : 1

 

Shell代码   收藏代码
  1. error_log  /opt/nginx/logs/error.log notice;  

      说明:指定错误日志的路径、级别,所有的级别包括debug、info、notice、warn、error、crit

 

Shell代码   收藏代码
  1. pid  /opt/nginx/logs/nginx.pid;  

      说明:指定nginx启动时的进程文件。
  其他:
   1. nginx启动时,获取该文件的写权限,将当前进程(master process)的pid写入到nginx.pid文件。
   2. 一旦nginx启动,该文件即成为可读的,无法再次写入,可以避免nginx的重复启动。
   3. nginx.pid的文件内容是当前进程的pid,因此可以这样关闭:
       kill `cat /opt/nginx/logs/nginx.pid`
     不需要查看nginx的进程号:ps -ef | grep nginx

 

Shell代码   收藏代码
  1. worker_rlimit_nofile  65535;  

      说明:设置一个nginx进程能够打开的最大文件数。
  其他:
   1. 默认情况下,nginx进程能够打开的文件数受限于当前的操作系统。
   2. 查看系统的最大文件数:当前的CentOS为1024。
    ulimit -a
    ulimit -n

 

Shell代码   收藏代码
  1. events {  
  2.    use  epoll;  
  3.    worker_connections  65535;  

      说明:
   1. 设置网络IO模型:
     epoll:在Linux内核2.6以上版本可用,查看Linux版本:cat /proc/version
   和标准的select模式比较,处理时间更短,采用了类似于数据库的索引机制,以空间换时间.
     kqueue:适用于FreeBSD系统。
   2. worker_connections:单个worker进程允许的最大并发连接数。
     理论上,每台nginx服务器的最大连接数为worker_processes * worker_connections,
    但是nginx进行调度时,分配用户请求给worker进程并不均匀,无法达到最大值。

 

Shell代码   收藏代码
  1. charset  utf-8;  

      说明:http作用域,设置编码格式,可不统一设置。

 

Shell代码   收藏代码
  1. log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '  
  2.                     '$status $body_bytes_sent "$http_referer" '  
  3.                     '"$http_user_agent" "$http_x_forwarded_for" '  
  4.                     '"$sent_http_content_type" "$request_time"';   

      说明:http作用域.
   1. 该日志格式定义为access名称。
   2. 日志格式:原有选项
    $remote_addr:客户端IP地址,如果使用nginx进行了反向代理,获取的是nginx服务器的地址。  

    $remote_user:客户端用户名。 
    $time_local:客户端进行访问时的本地时间。    [21/Jun/2014:23:35:19 +0800]
    $request:请求方式、路径、协议。    [GET /html/ HTTP/1.1]
    $status:请求状态码,成功为200。
    $body_bytes_sent:发送给客户端的文件主体大小。    [49]
    $http_referer:记录从哪个页面链接过来的。
    $http_user_agent:客户端浏览器。
    $http_x_forwarded_for:使用反向代理后,真实的客户端IP地址。
   3. 日志格式:追加选项
    $sent_http_content_type:响应的内容类型。    [text/html; charset=utf-8]
    $request_time:处理用户请求的时间,包括接收请求、返回响应的时间。    [0.000]

 

Shell代码   收藏代码
  1. access_log  /opt/nginx/logs/access.log access;  

      说明:http作用域,指定日志文件的位置。

 

Shell代码   收藏代码
  1. sendfile  on;  

      说明:http作用域,是否开启linux系统的零拷贝(zero copy)功能,针对普通的应用设为on。
    针对下载(或者大量图片显示)等涉及大量磁盘IO的操作设为off,可以有效减少数据拷贝。

  

Shell代码   收藏代码
  1. tcp_nopush  on;  

      说明:http作用域,默认为off,将小的数据包组装发送,避免大量数据包导致的网络拥塞。

 

Shell代码   收藏代码
  1. tcp_nodelay  on;  

      说明:http作用域,设置响应无延迟,默认为on. 高版本的Linux系统允许和tcp_nopush同时使用。

 

Shell代码   收藏代码
  1. keepalive_timeout  65;  

      说明:http作用域,设置连接超时时间为65s
   1. 如果有大量图片显示、大文件上传等,设置地调整为一个较大值。
   2. 不能设置的太大,避免恶意的连接占用。

 

Shell代码   收藏代码
  1. gzip  on;  

      说明:http作用域,开启gzip压缩功能。
   1. 在服务端对响应内容进行压缩,客户端的浏览器具有gzip解压缩能力。
   2. 压缩比率高达30%以上,有效节省传输带宽。

 

Shell代码   收藏代码
  1. gzip_min_length  1k;  

       说明:页面内容大于1k时才进行压缩,避免内容过少导致的越压越大现象。

 

Shell代码   收藏代码
  1. gzip_buffers  8 32k;  

   说明:压缩时需要的缓冲区大小,避免大文件的丢失. 一共8块、每块32k。

 

Shell代码   收藏代码
  1. gzip_http_version  1.1;  

   说明:默认为HTTP/1.1协议,早期的浏览器可能不支持gzip功能。

 

Shell代码   收藏代码
  1. gzip_comp_level  3;  

   说明:设置压缩比率,范围为1-9,不宜设置的过大、以避免影响了CPU的性能。

     

Shell代码   收藏代码
  1. gzip_types  text/plain text/css text/javascript application/x-javascript application/xml;  

   说明:进行压缩的文件类型
   1. gzip默认会对text/html进行压缩,因此不用指定。
   2. 关于js:传统的标准类型为text/javascript,但js终究不是纯文本文件,

      推荐使用application/javascript, 但事实上,application/javascript并没有很好的支持,

      实际使用application/x-javascript,x前缀表示experimental。

 

Shell代码   收藏代码
  1. gzip_vary  on;  

   说明:根据http响应头判断浏览器是否支持gzip压缩,不支持即不压缩。
  使用火狐查看:
    响应头:Vary: Accept-Encoding
    请求头:Accept-Encoding gzip, deflate

 

Shell代码   收藏代码
  1. server_names_hash_bucket_size  128;  

   说明:后端服务器名字的哈希存储大小,如果服务器很多,可以适当调大一点。

  

Shell代码   收藏代码
  1. client_header_buffer_size  32k;  

   说明:说明:nginx默认使用该大小的buffer来读取header值。

 

Shell代码   收藏代码
  1. large_client_header_buffers  4 32k;  

   说明:如果header过大,使用该buffer来读取header。

 

Shell代码   收藏代码
  1. client_max_body_size  100m;  

   说明:客户端能够上传的最大文件大小。

 

Shell代码   收藏代码
  1. client_body_buffer_size  128k;  

   说明:处理客户端请求(通过POST发送的数据、文件上传)的buffer大小,
    如果超过此大小限制,则全部或部分存储到一个临时文件。

 

   启动、关闭:su - root

     检查配置文件是否修改正确:

Shell代码   收藏代码
  1. /usr/local/nginx/sbin/nginx -t  

          平滑启动:

Shell代码   收藏代码
  1. kill -HUP `cat /opt/nginx/logs/nginx.pid`  

 


3.虚拟目录和虚拟主机


下面简单介绍Nginx的虚拟目录和虚拟主机的配置,通过虚拟目录的设置可以直接访问Linux系统下面的静态资源文件,通过虚拟主机的设置可以在一台机器上模拟出多个逻辑上互不相干的独立主机。吻

 

<一>. 虚拟目录:

  通过使用index选项可以指定相对路径,root选项指定的路径和用户的请求路径拼接成一个完成的Linux文件路径。使用alias选项可以指定一个Linux系统的绝对路径。

 1. root选项:静态文件的路径为/software/html/index.html  

Shell代码   收藏代码
  1. location /html {  
  2.     root  /software;  
  3.     index  index.html index.htm;  
  4. }  

  2. alias选项:静态文件的路径为/software/html/index.html  

Shell代码   收藏代码
  1. location /html {  
  2.     alias  /software/html;  
  3.     index  index.html index.htm;  
  4. }  

  

<二>. 虚拟主机:Virtual Host大笑

 1. 简介:虚拟主机是一种特殊的软硬件技术,允许将一台物理机器“虚拟”成多个完全独立的主机。

    Nginx可以使用多种方式配置虚拟主机,下面仅介绍基于域名的配置方式。

    需要进行DNS配置,一个物理主机设置多个域名,然后配置Nginx,让其识别不同的域名。

 2. 进行DNS的设置:

   Windows平台:C:\WINDOWS\system32\drivers\etc下面的hosts文件追加   

Shell代码   收藏代码
  1. 192.168.142.56  www.excelsoft.com excelsoft.com blog.excelsoft.com www.blog.com image.excelsoft.com  

    Linux平台:编辑/etc/hosts文件,给本机追加多个域名。 

Shell代码   收藏代码
  1. 127.0.0.1  localhost ... www.excelsoft.com excelsoft.com blog.excelsoft.com www.blog.com image.excelsoft.com  

  3. 给nginx.conf配置虚拟主机:一共设置了3台虚拟主机,都在80端口进行监听。

          第一台虚拟主机:独立的图片image域名,关闭日志功能off

Shell代码   收藏代码
  1. server {  
  2.     listen       80;  
  3.     server_name  image.excelsoft.com;  
  4.   
  5.     location / {  
  6.         root  /software/image;  
  7.     }  
  8.   
  9.     access_log  off;  
  10. }  

            第二台虚拟主机:excelsoft域名,及其二级域名blog;但是不包括image.excelsoft.com域名,

 因为二级域名image按照书写顺序和第一台虚拟主机相匹配。  

Shell代码   收藏代码
  1. server {  
  2.       listen       80;  
  3.       server_name  www.excelsoft.com excelsoft.com *.excelsoft.com;  
  4.   
  5.       location / {  
  6.           root  /software/html;  
  7.           index  index.html index.htm;  
  8.       }  
  9.   
  10.       access_log  /opt/nginx/logs/access.excelsoft.log access;  
  11.   }  

         第三台虚拟主机: 

Shell代码   收藏代码
  1. server {  
  2.      listen       80;  
  3.      server_name  www.blog.com;  
  4.   
  5.      location / {  
  6.          root  /software/blog;  
  7.          index  index.html index.htm;  
  8.      }  
  9.   
  10.      access_log  /opt/nginx/logs/access.blog.log access;  
  11.  }  

 

<三>. 进行测试:su - root

   配置校验:/usr/local/nginx/sbin/nginx -t

  平滑重启:kill -HUP `cat /opt/nginx/logs/nginx.pid`

  测试地址:皱眉

     http://image.excelsoft.com/hello.gif

      http://www.excelsoft.com

      http://blog.excelsoft.com

      http://www.blog.com

 


4.日志切割和环境变量


在真实的Nginx实践过程中,我们通常都会对Nginx的访问日志进行切割,即按照一定的周期生成一个独立的Nginx访问日志文件,以避免存在文件体积过于庞大的日志文件。一方面有助于实际的错误排查,更重要的是有利于Nginx对访问文件的写入天真。同时,可以将Nginx的安装路径加入到环境变量,甚至可以编写启动关闭脚本,以方便实际操作。皱眉

 

<一>. 切割日志文件:
 1. 编写脚本:su - root
        进入主目录:cd ~
        编写脚本:vi split-nginx-log.sh大笑

Shell代码   收藏代码
  1. #!/bin/bash  
  2.   
  3. log_path="/opt/nginx/logs"  
  4. dir_name=`date -d "yesterday" +%Y%m`  
  5. file_name=`date -d "yesterday" +%Y.%m_%d`  
  6.   
  7. mkdir -p ${log_path}/${dir_name}  
  8. mv ${log_path}/access.log ${log_path}/${dir_name}/${file_name}.log  
  9.   
  10. kill -USR1 `cat ${log_path}/nginx.pid`  

       细节说明:
         1. 前一天的日期:date -d "yesterday" +%Y%m%d
         2. 递归创建目录,如果已存在则不创建:mkdir -p ${log_path}/${dir_name}
         3. 对日志文件重命名:mv access.log new.access.log 
         4. 通知nginx主进程重新打开日志文件:kill -USR1 `cat /opt/nginx/logs/nginx.pid`

 2. 赋予执行权限、执行:

Shell代码   收藏代码
  1. ls -al  
  2. chmod 744 split-nginx-log.sh  
  3. ./split-nginx-log.sh  

 3. 定时调度:每天零点切割日志  酷

Shell代码   收藏代码
  1. crontab -e  
  2. 00 00 * * * /root/split-nginx-log.sh  

 

<二>. 设置环境变量:
 1. 编辑当前用户PATH:
        显示PATH:echo $PATH
         用户主目录:cd ~
         编辑文件、追加如下内容:vi .bash_profile大笑

Shell代码   收藏代码
  1. NGINX_HOME=/usr/local/nginx  
  2. PATH=$NGINX_HOME/sbin:$PATH  
  3. export PATH  

       立即生效:source .bash_profile
 2. 启动、关闭: 

Shell代码   收藏代码
  1. nginx -c /usr/local/nginx/conf/nginx.conf  
  2. nginx -s quit  

    3. 可执行脚本:
   启动:vi start-nginx.sh

Shel代码   收藏代码
  1. nginx -c /usr/local/nginx/conf/nginx.conf  

   关闭:vi stop-nginx.sh   

Shell代码   收藏代码
  1. nginx -s quit  

    执行权限:   

Shell代码   收藏代码
  1. chmod 744 start-nginx.sh  
  2. chmod 744 stop-nginx.sh  

    执行脚本:蠢话

Shell代码   收藏代码
  1. ./start-nginx.sh  
  2. ./stop-nginx.sh  

 



5.Nginx与Tomcat的整合


DK(Java Development Tookkit)中包含了jre(Java Runtime Environment),而jre是一个java应用运行的基础平台,为此需要在Linux系统上面事先安装JDK环境。然后再安装Tomcat作为web服务器,最后可以将nginx和tomcat进行整合,作为负载均衡和反向代理的基础。

 

<一>. 安装JDK:
     上传文件:使用nick账号上传jdk-6u45-linux-i586.bin到/software下面。

      进行安装:

Shell代码   收藏代码
  1. su - nick                                #切换账号  
  2. cd /software                             #切换路径  
  3. mv jdk-6u45-linux-i586.bin /usr/local    #移动文件  
  4. cd /usr/local                            #切换路径  
  5. chmod 744 jdk-6u45-linux-i586.bin        #修改权限:当前用户可执行  
  6. ./jdk-6u45-linux-i586.bin                #进行安装  
  7. rm jdk-6u45-linux-i586.bin               #删除安装程序  
  8. mv jdk1.6.0_45 jdk                       #重命名安装目录  

    设置环境变量:

Shell代码   收藏代码
  1. echo $PATH                                #查看PATH  
  2. cd ~                                      #切换到主目录  
  3. vi .bash_profile                          #编辑当前用户的环境变量  

    追加如下内容:

Shell代码   收藏代码
  1. JAVA_HOME=/usr/local/jdk  
  2. PATH=$JAVA_HOME/bin:$PATH  
  3. CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar  
  4. export JAVA_HOME PATH CLASSPATH  
Shell代码   收藏代码
  1. source .bash_profile                      #立即生效  
Shell代码   收藏代码
  1. java -version                             #验证是否安装成功  

 

 <二>. 安装Tomcat:
     上传文件:使用nick账号上传apache-tomcat-6.0.37.tar.gz到/software下面。

Shell代码   收藏代码
  1. su - nick                                  #切换账号  
  2. cd /software                               #切换路径  
  3. mv apache-tomcat-6.0.37.tar.gz /usr/local  #移动文件  
  4. cd /usr/local                              #切换路径  
  5. tar -zxvf apache-tomcat-6.0.37.tar.gz      #进行安装  
  6. rm apache-tomcat-6.0.37.tar.gz             #删除安装程序  
  7. mv apache-tomcat-6.0.37 tomcat             #重命名安装目录  

     启动/关闭:

Shell代码   收藏代码
  1. cd /usr/local/tomcat/bin                    #进入bin路径  
  2. ./startup.sh                                #启动  
  3. ./shutdown.sh                               #启动  

    设置环境变量:

Shell代码   收藏代码
  1. echo $PATH                                   #查看PATH  
  2. cd ~                                         #切换到主目录  
  3. vi .bash_profile                             #编辑当前用户的环境变量  

     追加如下内容:

Shell代码   收藏代码
  1. CATALINA_HOME=/usr/local/tomcat  
  2. PATH=$CATALINA_HOME/bin:$PATH  
  3. export CATALINA_HOME PATH   
Shell代码   收藏代码
  1. source .bash_profile                         #立即生效  

     进行访问:任意路径都可执行

Shell代码   收藏代码
  1. startup.sh                                   #启动  
  2. shutdown.sh                                  #关闭  

 

 <三>. nginx与tomcat整合:
   项目内部的动态、静态请求都转发至tomcat,项目外部的静态资源请求转发至图片服务器。

 1. 代理配置:http作用域.

Shell代码   收藏代码
  1. proxy_connect_timeout  90;  

     说明:nginx和后端服务器的请求连接超时时间,默认为60s

Shell代码   收藏代码
  1. proxy_read_timeout  90;  

       说明:连接成功后,排队等候处理超时时间,默认为60s

Shell代码   收藏代码
  1. proxy_send_timeout  90;  

       说明:后端服务器的数据发送超时时间,默认60s

Shell代码   收藏代码
  1. proxy_buffer_size  16k;  

       说明:代理缓冲区,保留后端服务器响应的第一部分,通常为响应的头部

Shell代码   收藏代码
  1. proxy_buffers  4 32k;  

       说明:保留后端服务器的响应数据,每块缓冲区32k,一共有4块

Shell代码   收藏代码
  1. proxy_busy_buffers_size  64k;  

       说明:系统繁忙时,申请更大的代理缓冲区,推荐为上述值的2倍

Shell代码   收藏代码
  1. proxy_temp_file_write_size  128k;  

       说明:缓冲区无法保存时,将数据写至临时文件,默认存放目录为nginx安装目录下的/proxy_temp

 2. 设置后端tomcat访问路径:http作用域

Shell代码   收藏代码
  1. upstream tomcat_server {  
  2.     server  192.168.142.56:8080;  
  3. }  

   3. 项目内部的资源请求转发给tomcat:

Shell代码   收藏代码
  1. server {  
  2.     listen       80;  
  3.     server_name  www.excelsoft.com;  
  4.   
  5.     location / {  
  6.         proxy_pass  http://tomcat_server;  
  7.         proxy_set_header Host $host;  
  8.         proxy_set_header X-Real-IP $remote_addr;  
  9.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  10.   
  11.         index  index.html index.htm index.jsp index.do;  
  12.         access_log  /opt/nginx/logs/access.excelsoft.log access;  
  13.     }  
  14.   
  15.     location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {  
  16.         proxy_pass  http://tomcat_server;  
  17.   
  18.         expires  15d;  
  19.         access_log  off;  
  20.     }  
  21.   
  22.     location ~ \.(js|css)$ {  
  23.         proxy_pass  http://tomcat_server;  
  24.   
  25.         expires  1h;  
  26.         access_log  off;  
  27.     }  
  28. }  

  4. 静态资源虚拟主机:

Shell代码   收藏代码
  1. server {  
  2.     listen       80;  
  3.     server_name  static.excelsoft.com;  
  4.    
  5.     root  /software/static;  
  6.     access_log  off;  
  7.   
  8.     location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {  
  9.         expires  15d;  
  10.     }  
  11.   
  12.     location ~ \.(js|css)$ {  
  13.         expires  1h;  
  14.     }  
  15. }  

 

 <四>. 测试验证:su - root
 1. 校验nginx.conf合法性:

Shell代码   收藏代码
  1. /usr/local/nginx/sbin/nginx -t  

    2. nginx平滑重启:

Shell代码   收藏代码
  1. kill -HUP `cat /opt/nginx/logs/nginx.pid`  

 


6.代理缓存与负载均衡


简要介绍Nginx的代理缓存,以及使用多台Tomcat服务器进行负载均衡。

 

<一>. 代理数据存放目录:吻

Shell代码   收藏代码
  1. proxy_temp_path  /software/proxy_temp;  

     说明:代理临时目录,存在于http作用域,nginx用作代理时,用来存放和后端服务器进行交互的相关数据, 如前端用户的请求、后端服务器的响应,默认位置为nginx安装路径下面的/proxy_temp。

Shell代码   收藏代码
  1. proxy_cache_path  /software/proxy_cache levels=1:2 keys_zone=cache_web:16m inactive=1h max_size=512m;  

    说明:代理缓存目录,存在于http作用域,nginx进行web缓存时,将静态资源缓存到nginx当前所在的机器。

  1. proxy_temp_path和proxy_cache_path必须指定为同一分区。

  2. 参数levels=1:2  指定缓存空间为二级hash目录,第一级为1个字符,第二级为2个字符,比如/7/c2。

  3. 参数keys_zone=cache_web:16m  用户存放key和元数据的缓存区间,命名为cache_web,16m大小。 

  4. 参数inactive=1h  如果资源在1h内未被请求,从缓存区中清除。

  5. 参数max_size=512m  指定本地缓存空间的大小,如果资源过于庞大时,按照LRU算法进行清除。

 

<二>. 定义服务器集群:大笑

Shell代码   收藏代码
  1. upstream blog_server_cluster {  
  2.     server  192.168.142.56:8080 weight=1 max_fails=2 fail_timeout=30s;  
  3.     server  192.168.142.78:8080 weight=2 max_fails=2 fail_timeout=30s;  
  4.     server  192.168.142.91:8080 weight=2 max_fails=2 fail_timeout=30s;  
  5. }  

     说明:存在于http作用域,同一组服务器相互之间进行负载的均衡。
  1. weight  指定各个服务器的权重,默认为1,权重越大处理的负载越多。
  2. max_fails  指定失败请求次数,大于该次数时,nginx认为该服务器处于不可用状态。
  3. fail_timeout  失败请求时间,大于该时间,nginx认为本次请求失败。

 

<三>. 设置web缓存:微笑

Shell代码   收藏代码
  1. proxy_cache  cache_web;  
  2. proxy_cache_key  $host$uri$is_args$query_string;  
  3.   
  4. proxy_cache_valid  200 304 1d;  
  5. proxy_cache_valid  301 302 1m;  
  6. proxy_cache_valid  any 1m;  

     说明:web缓存,存在于location作用域,将后端服务器的静态资源缓存到nginx所在的本地机器。
  1. proxy_cache  指定为上述定义的缓存区域。
  2. proxy_cache_key  指定缓存所使用的key的组合字符串,然后用md5进行加密。
     $host  主机名,如www.excelsoft.com。
     $uri  请求的项目内部路径,如/user/list.jsp。
     $is_args  如果有请求参数则为?符号,否则为空字符串""。
     $query_string  请求参数字符串。
  3. proxy_cache_valid  对不同状态码的URL设置不同的缓存时间(1d/1h/1m)。

 

<四>. http状态码:status code酷

  1. 2xx:success 
     200  请求成功 [Ok]
  2. 3xx:redirect 
     301  请求的资源被移除到新的位置,新的URI将在响应的Location字段中返回  [Moved Permanently]
     302  请求的资源临时从不同的URI进行响应  [Found]
     304  重复的请求,该响应不包含消息体   [Not Modified]
  3. 4xx:request error
     404  请求的资源未能在服务器上找到  [Not Found]
     403  找到请求的资源,但是无权限访问  [Forbidden]
  4. 5xx:server error
     500  程序出错,服务器无法处理  [Internal Server Error]
     502  错误网关,内部网络连接设置不正确,或者当前服务器待处理的连接过多,以至于连接超时  [Bad Gateway]

 

     到目前为止,已经比较全面的介绍了Nginx用作反向代理和负载均衡的诸多知识,为了能从整体上对配置文件有一个清楚地把握,下面给出nginx.conf文件的详尽内容眨眼,具体细节可参见之前的几篇博客:

 

Shell代码   收藏代码
  1. user  nick excelsoft;  
  2.   
  3. worker_processes  2;  
  4.   
  5. error_log  /opt/nginx/logs/error.log notice;  
  6.   
  7. pid  /opt/nginx/logs/nginx.pid;  
  8.   
  9. worker_rlimit_nofile  65535;  
  10.   
  11. events {  
  12.     use  epoll;  
  13.     worker_connections  65535;  
  14. }  
  15.   
  16.   
  17. http {  
  18.     include       mime.types;  
  19.     default_type  application/octet-stream;  
  20.   
  21.     charset  utf-8;  
  22.   
  23.     log_format  access '$remote_addr - $remote_user [$time_local] "$request" '  
  24.                        '$status $body_bytes_sent "$http_referer" '  
  25.                        '"$http_user_agent" "$http_x_forwarded_for" '  
  26.                        '"$sent_http_content_type" "$request_time"';   
  27.   
  28.     access_log  /opt/nginx/logs/access.log access;  
  29.   
  30.     sendfile  on;  
  31.     tcp_nopush  on;  
  32.     tcp_nodelay  on;  
  33.     keepalive_timeout  65;  
  34.       
  35.     gzip  on;  
  36.     gzip_min_length  1k;  
  37.     gzip_buffers  8 32k;  
  38.     gzip_http_version  1.1;  
  39.     gzip_comp_level  3;  
  40.     gzip_types  text/plain text/css text/javascript application/x-javascript application/xml;  
  41.     gzip_vary  on;  
  42.   
  43.     server_names_hash_bucket_size  128;  
  44.     client_header_buffer_size  32k;  
  45.     large_client_header_buffers  4 32k;  
  46.     client_max_body_size  100m;  
  47.     client_body_buffer_size  128k;  
  48.   
  49.     proxy_connect_timeout  90;  
  50.     proxy_read_timeout  90;  
  51.     proxy_send_timeout  90;  
  52.   
  53.     proxy_buffer_size  16k;  
  54.     proxy_buffers  4 32k;  
  55.     proxy_busy_buffers_size  64k;  
  56.     proxy_temp_file_write_size  128k;  
  57.   
  58.     proxy_temp_path  /software/proxy_temp;  
  59.     proxy_cache_path  /software/proxy_cache levels=1:2 keys_zone=cache_web:16m inactive=1h max_size=512m;  
  60.   
  61.     upstream blog_server_cluster {  
  62.         server  192.168.142.56:8080 weight=1 max_fails=2 fail_timeout=30s;  
  63.         server  192.168.142.78:8080 weight=2 max_fails=2 fail_timeout=30s;  
  64.         server  192.168.142.91:8080 weight=2 max_fails=2 fail_timeout=30s;  
  65.     }  
  66.   
  67.     server {  
  68.         listen       80;  
  69.         server_name  www.excelsoft.com;  
  70.   
  71.         location / {  
  72.             proxy_pass  http://blog_server_cluster;  
  73.   
  74.             proxy_set_header Host $host;  
  75.             proxy_set_header X-Real-IP $remote_addr;  
  76.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  77.   
  78.             index  index.html index.htm index.jsp index.do;  
  79.             access_log  /opt/nginx/logs/access.excelsoft.log access;  
  80.         }  
  81.   
  82.         location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {  
  83.             proxy_pass  http://blog_server_cluster;  
  84.              
  85.             proxy_cache  cache_web;  
  86.             proxy_cache_key  $host$uri$is_args$query_string;  
  87.   
  88.             proxy_cache_valid  200 304 1d;  
  89.             proxy_cache_valid  301 302 1m;  
  90.             proxy_cache_valid  any 1m;   
  91.   
  92.             expires  15d;  
  93.             access_log  off;  
  94.         }  
  95.   
  96.         location ~ \.(js|css)$ {  
  97.             proxy_pass  http://blog_server_cluster;  
  98.   
  99.             proxy_cache  cache_web;  
  100.             proxy_cache_key  $host$uri$is_args$query_string;  
  101.   
  102.             proxy_cache_valid  200 304 1d;  
  103.             proxy_cache_valid  301 302 1m;  
  104.             proxy_cache_valid  any 1m;  
  105.   
  106.             expires  1h;  
  107.             access_log  off;  
  108.         }  
  109.     }  
  110.   
  111.     server {  
  112.         listen       80;  
  113.         server_name  static.excelsoft.com;  
  114.   
  115.         root  /software/static;  
  116.         access_log  off;  
  117.   
  118.         location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {  
  119.             expires  15d;  
  120.         }  
  121.   
  122.         location ~ \.(js|css)$ {  
  123.             expires  1h;  
  124.         }  
  125.     }  
  126. }  

 


你可能感兴趣的:(nginx)