Nginx入门知识

Nginx简介

Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web 服务器 和 反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器。php

Nginx 是由俄罗斯的程序设计师 Igor Sysoev 所开发,为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过四年多时间了,Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。Nginx 超越Apache的高性能和稳定性,使得国内使用 Nginx 做为 Web 服务器的网站也愈来愈多。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;新近发现 Nginx 技术在国内日趋火热,愈来愈多的网站开始应用部署Nginx。css

Nginx的优势

         (1)Nginx 能够在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 的1.2.6稳定版已经于2012年12月11日发布,[1]1.3.10开发版已经于2012年12月25日发布,若是新建站点,建议使用最新稳定版做为生产版本,已有站点升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。html

(2)Nginx 是一个很强大的高性能Web和反向代理服务器,它具备不少很是优越的特性:
在高链接并发的状况下,Nginx是Apache服务器不错的替代品:Nginx在美国是作虚拟主机生意的老板们常常选择的软件平台之一。可以支持高达 50,000 个并发链接数的响应,感谢Nginx为咱们选择了 epoll and kqueue做为开发模型。
linux

(3)Nginx做为负载均衡服务器:Nginx 既能够在内部直接支持 Rails 和 PHP 程序对外进行服务,也能够支持做为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不管是系统资源开销仍是CPU使用效率都比 Perlbal 要好不少。做为邮件代理服务器:Nginx 同时也是一个很是优秀的邮件代理服务器(最先开发这个产品的目的之一也是做为邮件代理服务器),Last. fm 描述了成功而且美妙的使用经验。nginx

(4)Nginx 是一个安装很是的简单,配置文件很是简洁(还可以支持perl语法),Bugs很是少的服务器:Nginx 启动特别容易,而且几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动。你还可以不间断服务的状况下进行软件版本的升级。web

Linux下安装Nginx

第一步:下载Nginx

第一步:从 http://nginx.org/download/ 上下载相应的版本
直接在Linux上用命令下载
正则表达式

wget http://nginx.org/download/nginx-1.5.9.tar.gz

第二步:解压

若是你下载的包是tar.gz 或者.tar包,直接使用tar命令解压文件。算法

tar -zxvf nginx-1.5.9.tar.gz

第三步: 配置nginx安装参数

在命令行下进入解压好的nginx源码文件夹中,在该文件夹中存在可执行的configure文件,该执行程序是配置Nginx的安装参数,好比安装路径等。后端

Nginx的安装参数有如下几种:浏览器

–prefix=<path> – Nginx安装路径。若是没有指定,默认为 /usr/local/nginx 
–sbin-path=<path> – Nginx可执行文件安装路径。只能安装时指定,若是没有指定,默认为<prefix>/sbin/nginx 
–conf-path=<path> – 在没有给定-c选项下默认的nginx.conf的路径。若是没有指定,默认为<prefix>/conf/nginx.conf 
–pid-path=<path> – nginx.conf中没有指定pid指令的状况下,默认的nginx.pid的路径。若是没有指定,默认为 <prefix>/logs/nginx.pid 
–lock-path=<path> – nginx.lock文件的路径。 
–error-log-path=<path> – nginx.conf中没有指定error_log指令的状况下,默认的错误日志的路径。若是没有指定,默认为 <prefix>/logs/error.log 
–http-log-path=<path> – nginx.conf中没有指定access_log指令的状况下,默认的访问日志的路径。若是没有指定,默认为 <prefix>/logs/access.log 
–user=<user> – nginx.conf中没有指定user指令的状况下,默认的nginx使用的用户。若是没有指定,默认为 nobody 
–group=<group> – nginx.conf中没有指定user指令的状况下,默认的nginx使用的组。若是没有指定,默认为 nobody 
–builddir=DIR – 指定编译的目录 
–with-rtsig_module – 启用 rtsig 模块 
–with-select_module –without-select_module – 容许或不容许开启SELECT模式. 
–with-http_ssl_module – 开启HTTP SSL模块,使NGINX能够支持HTTPS请求。这个模块须要已经安装了OPENSSL,在DEBIAN上是libssl 
–with-http_realip_module – 启用 ngx_http_realip_module 
–with-http_addition_module – 启用 ngx_http_addition_module 
–with-http_sub_module – 启用 ngx_http_sub_module 
–with-http_dav_module – 启用 ngx_http_dav_module 
–with-http_flv_module – 启用 ngx_http_flv_module 
–with-http_stub_status_module – 启用 “server status”  
–without-http_charset_module – 禁用 ngx_http_charset_module 
–without-http_gzip_module – 禁用 ngx_http_gzip_module. 若是启用,须要 zlib  
–without-http_ssi_module – 禁用 ngx_http_ssi_module 
–without-http_userid_module – 禁用 ngx_http_userid_module 
–without-http_access_module – 禁用 ngx_http_access_module 
–without-http_auth_basic_module – 禁用 ngx_http_auth_basic_module 
–without-http_autoindex_module – 禁用 ngx_http_autoindex_module 
–without-http_geo_module – 禁用 ngx_http_geo_module 
–without-http_map_module – 禁用 ngx_http_map_module 
–without-http_referer_module – 禁用 ngx_http_referer_module 
–without-http_rewrite_module – 禁用 ngx_http_rewrite_module. 若是启用须要 PCRE  
–without-http_proxy_module – 禁用 ngx_http_proxy_module 
–without-http_fastcgi_module – 禁用 ngx_http_fastcgi_module 
–without-http_memcached_module – 禁用 ngx_http_memcached_module 
–without-http_limit_zone_module – 禁用 ngx_http_limit_zone_module 
–without-http_empty_gif_module – 禁用 ngx_http_empty_gif_module 
–without-http_browser_module – 禁用 ngx_http_browser_module 
–without-http_upstream_ip_hash_module – 禁用 ngx_http_upstream_ip_hash_module 
–with-http_perl_module – 启用 ngx_http_perl_module 
–with-perl_modules_path=PATH – 指定 perl 模块的路径 
–with-perl=PATH – 指定 perl 执行文件的路径 
–http-log-path=PATH – Set path to the http access log 
–http-client-body-temp-path=PATH – Set path to the http client request body temporary files 
–http-proxy-temp-path=PATH – Set path to the http proxy temporary files 
–http-fastcgi-temp-path=PATH – Set path to the http fastcgi temporary files 
–without-http – 禁用 HTTP server 
–with-mail – 启用 IMAP4/POP3/SMTP 代理模块 
–with-mail_ssl_module – 启用 ngx_mail_ssl_module 
–with-cc=PATH – 指定 C 编译器的路径 
–with-cpp=PATH – 指定 C 预处理器的路径 
–with-cpu-opt=CPU – 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 
–without-pcre – 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也须要 PCRE  
–with-pcre=DIR – 指定 PCRE 库的源代码的路径。 
–with-pcre-opt=OPTIONS – Set additional options for PCRE building. 
–with-md5=DIR – Set path to md5 library sources. 
–with-md5-opt=OPTIONS – Set additional options for md5 building. 
–with-md5-asm – Use md5 assembler sources. 
–with-sha1=DIR – Set path to sha1 library sources. 
–with-sha1-opt=OPTIONS – Set additional options for sha1 building. 
–with-sha1-asm – Use sha1 assembler sources. 
–with-zlib=DIR – Set path to zlib library sources. 
–with-zlib-opt=OPTIONS – Set additional options for zlib building. 
–with-zlib-asm=CPU – Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro 
–with-openssl=DIR – Set path to OpenSSL library sources 
–with-openssl-opt=OPTIONS – Set additional options for OpenSSL building 
–with-debug – 启用调试日志 
–add-module=PATH – Add in a third-party module found in directory PATH 

一般状况下,咱们只须要默认设置便可。 执行设置编译参数,并设置安装路径为/usr/local/nginx

./configure –prefix=/usr/local/nginx

第四步:make 编译

在Linux命令行下,切换到nginx的源码包目录中(即刚刚解压的路径)

执行make命令

make的过程是把各类语言写的源码文件,变成可执行文件和各类库文件

./make

第五步:make install 安装

第四步中执行make命令完成,若没有出错,则能够执行安装命令。

make install是把这些编译出来的可执行文件和库文件复制到合适的地方

./make install

异常状况解决办法

在配置信息的时候,也就是在第三步,可能会出现一些错误:

1:未安装PCRE

Nginx 1.jpg

错误为:./configure: error: the HTTP rewrite module requires the PCRE library.

这个错误是因为Nginx的rewrite模块依赖于PCRE功能,若是须要启用rewrite功能,须要首先安装PCRE库。(rewrite是Nginx中很重要的模块,因此咱们须要安装PCRE)

安装完成PCRE库以后,执行make和make install,软件顺利安装。

下载pcre

pcre主页位置为:http://www.pcre.org/

选择适当的方式下载pcre安装包

wget http://sourceforge.net/projects/pcre/files/pcre/7.8/pcre-7.8.tar.bz2/download

解压缩

进入到下载文件所在目录中,执行解压缩命令

tar xjpf pcre-7.8.tar.bz2

编译安装

当前目录切换到pcre解压后的目录中

执行设置安装命令:

./configure --prefix=/usr/local/pcre-7.8 --libdir=/usr/local/lib/pcre --includedir=/usr/local/include/pcre

编译

make

编译安装

make install

测试安装

程序的启动方式是/usr/local/nginx/sbin/nginx

此时打开浏览器,输入服务器地址看到以下画面即为安装成功。

Nginx 2.png

配置Nginx

Nginx的配置文件为存放在根目录的conf文件夹中的nginx.conf

默认安装完Nginx后,服务器会自带一个nginx默认配置,用户若须要实现本身的功能,须要修改配置文件来实现。

一般状况下,咱们不直接在主配置文件中添加nginx配置信息,而是分不一样的站点,配置不一样的配置文件,而后引入到主文件中。

在nginx的配置文件conf目录下建立一个专门存仿配置文件的目录,命名为vhosts,能够把虚拟目录的配置所有放在这里。在里面建立名为websuitA.conf的配置文件。在主文件中的引入配置文件的作法在http{***}中引入以下代码:

include /usr/local/nginx/conf/vhosts/*.conf;

websuitA.conf文件写法以下:

server {
   listen 80;#监听的端口号
   server_name websuitA.com;#域名
   location / {
       root X:/wnmp/www/websuitA;    #站点的路径
       #若是用户是用IE访问,则跳转到/nginx-ie/
       if ($http_user_agent ~ MSIE) {
            rewrite ^(.*)$ /nginx-ie/$1 break;
       }
   }
   #错误页的配置
   error_page 404 /error.html;
   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
       root html;
   }
}

 

1:多站点分发的配置方式

一般来讲 一个nginx服务器可能会配置多个站点信息,好比:

a1.newegg.com => 192.168.1.1
a2.newegg.com => 192.168.1.2
a3.newegg.com => 192.168.1.3

此时,能够经过多个server_name以及proxy配置来实现:

server {
       listen                          80;
       server_name              a1.newegg.com;         #访问的站点URL地址
       location / {
                    proxy_store off;                            #反向代理缓存
                    proxy_redirect  off;                        #不展现给客户真实域名
                    proxy_pass    http://192.168.1.1;           #须要反向代理的服务器地址
                    proxy_set_header Host $host;                #设置host为请求的主机名称
                    proxy_set_header X-real-ip $remote_addr;    #用户请求的IP地址
       }
}
server {
       listen                          80;
       server_name              a2.newegg.com;
       location / {
                    proxy_store off;
                    proxy_redirect  off;
                    proxy_pass    http://192.168.1.2;
                    proxy_set_header Host $host;
                    proxy_set_header X-real-ip $remote_addr;
       }
}
server {
       listen                          80;
       server_name              a3.newegg.com;
       location / {
                    proxy_store off;
                    proxy_redirect  off;
                    proxy_pass    http://192.168.1.3;
                    proxy_set_header Host $host;
                    proxy_set_header X-real-ip $remote_addr;
       }
}

2:负载均衡配置

a1.nginx.com=>192.168.1.1192.1.168.1.2192.168.1.3:8080

配置以下:

server {
       listen                          80;
       server_name              a1.newegg.com;         #访问的站点URL地址
       location / {
                    proxy_store off;                           #反向代理缓存
                    proxy_redirect  off;                       #不展现给客户真实域名
                    proxy_pass    http://a1;                   #须要反向代理的服务器地址
                    proxy_set_header Host $host;               #设置host为请求的主机名称
                    proxy_set_header X-real-ip $remote_addr;   #用户请求的IP地址
       }
}
upstream a1{
      server  192.168.1.1;
      server  192.168.1.2;
      server  192.168.1.3:8080;
}

3:根据不一样的路径,分发到不一样的服务器

www.newegg.com/a1/  =>  192.168.1.1
www.newegg.com/a2/  =>  192.168.1.2

示例:

server {
       listen                          80;
       server_name              www.newegg.com;            #访问的站点URL地址
       location /a1/ {
                    proxy_store off;                                      #反向代理缓存
                    proxy_redirect  off;                                  #不展现给客户真实域名
                    proxy_pass    http://192.168.1.1;                     #须要反向代理的服务器地址
                    proxy_set_header Host $host;                          #设置host为请求的主机名称
                    proxy_set_header X-real-ip $remote_addr;              #用户请求的IP地址
       }
location /a2/ {
                    proxy_store off;                                      #反向代理缓存
                    proxy_redirect  off;                                  #不展现给客户真实域名
                    proxy_pass    http://192.168.1.2;                     #须要反向代理的服务器地址
                    proxy_set_header Host $host;                          #设置host为请求的主机名称
                    proxy_set_header X-real-ip $remote_addr;              #用户请求的IP地址
       }
}

4:后缀为JPG/PNG/GIF的路径,重定向到资源服务器

www.newegg.com/test.jpg => image1.newegg.com/test.jpg
server {
       listen                          80;
       server_name              www.newegg.com;
       location ~* \.jpg$  {
                    proxy_store off;
                    proxy_redirect  off;
                    proxy_pass    http://images;
                    proxy_set_header Host $host;
                    proxy_set_header X-real-ip $remote_addr;
       }
}
upstream a1{
      server  image1.newegg.com;
      server  image2.newegg.com;
      server  image3.newegg.com;
}

Nginx重要参数详解

upstream

nginx的upstream目前支持5种方式的分配

1、轮询(默认)

每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。

2、weight

指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。

例如:

upstream a1 {
   server 192.168.1.1 weight=10;
   server 192.168.1.2 weight=10;
}

3、ip_hash

每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。

例如:

upstream a1 {
   ip_hash;
   server 192.168.1.1;
   server 192.168.1.2;
}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream a1 {
   server server1;
   server server2;
   fair;
}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法

upstream a1 {
   server squid1:3128;
   server squid2:3128;
   hash $request_uri;
   hash_method crc32;
}


示例:

upstream a1{
    #定义负载均衡设备的Ip及设备状态
    ip_hash;
    server 127.0.0.1:9090 down;
    server 127.0.0.1:8080 weight=2;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
}

在须要使用负载均衡的server中增长

proxy_pass http://a1;


每一个设备的状态设置为:

1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间.
5.backup 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 能够讲client post过来的数据记录到文件中用来作debug
client_body_temp_path 设置记录文件的目录 能够设置最多3层目录
location URL进行匹配.能够进行重定向或者进行新的代理 负载均衡

要用nginx作负载均衡的话,首先要在配置文件里面定义一组用来负载均衡的后端服务器(backend servers),例如:

upstream a1 {
   server 192.168.1.1;
   server 192.168.1.2;
   server 192.168.1.3;
}

那个server指令的语法是 server name [parameters],这里的name是服务器名,能够是域名、ip或者unix socket,也能够指定端口,例如:

server 192.168.1.1:8080;

server指令可用的参数有:

weight —— 设置服务器的权重,默认值是1,权重值越大那么该服务器被访问到的概率就越大,例如 server 192.168.1.11 weight=5;
max_failsfail_timeout —— 这俩是关联的,若是某台服务器在fail_timeout时间内出现了max_fails次链接失败,那么nginx就会认为那个服务器已经挂掉,从而在fail_timeout时间内再也不去查询它,fail_timeout的默认值是10smax_fails的默认值是1(这意味着一发生错误就认为服务器挂掉),若是把max_fails设为0则表示把这个检查取消。
down —— 表示该服务器已经停用,例如server 192.168.1.11 down;
backup —— 表示该服务器是备用服务器,只有其它后端服务器都挂了或者很忙才会访问到。

举个例子:server 192.168.1.11 max_fails=3 fail_timeout=30s; 这表示,若是服务器192.168.1.11在30秒内出现了3次错误,那么就认为这个服务器工做不正常,从而在接下来的30秒内nginx再也不去访问这个服务器。

Location

语法规则: location [=|~|~*|^~] /uri/ { … }

开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径便可。nginx不对url作编码,所以请求为/static/20%/aa,能够被规则^~ /static/ /aa匹配到(注意是空格)。

~ 开头表示区分大小写的正则匹配

~*  开头表示不区分大小写的正则匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

/ 通用匹配,任何请求都会匹配到。

多个location配置的状况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,没必要拘泥,仅供参考):

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,中止匹配,按当前匹配规则处理请求。

例子,有以下匹配规则:

location = / {
  #规则A
}
location = /login {
  #规则B
}
location ^~ /static/ {
  #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
  #规则D
}
location ~* \.png$ {
  #规则E
}
location !~ \.xhtml$ {
  #规则F
}
location !~* \.xhtml$ {
  #规则G
}
location / {
  #规则H
}

那么产生的效果以下:

访问根目录/, 好比 http://localhost/ 将匹配规则A

访问 http://localhost/login 将匹配规则B

访问 http://localhost/register 则匹配规则H

访问 http://localhost/static/a.html 将匹配规则C

访问 http://localhost/a.gifhttp://localhost/b.jpg 将匹配规则D和规则E,可是规则D顺序优先,规则E不起做用

而 http://localhost/static/c.png 则优先匹配到规则C

访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,由于规则E不区分大小写。

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML 不会匹配规则G,由于不区分大小写。规则F,规则G属于排除法,符合匹配规则可是不会匹配到,因此想一想看实际应用中哪里会用到。 http://localhost/a.XHTML不会匹配规则G,由于不区分大小写。规则F,规则G属于排除法,符合匹配规则可是不会匹配到,因此想一想看实际应用中哪里会用到。

访问 http://localhost/category/id/1111 则最终匹配到规则H,由于以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,好比FastCGI(php),tomcat(jsp),nginx做为方向代理服务器存在。

因此实际使用中,我的以为至少有三个匹配规则定义,以下:

 

  1. 直接匹配网站根,经过域名访问网站首页比较频繁,使用这个会加速处理
  1. 这里是直接转发给后端应用服务器了,也能够是一个静态首页
  1. 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}
  1. 第二个必选规则是处理静态文件请求,这是nginx做为http服务器的强项
  1. 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
  1. 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
  1. 非静态文件请求就默认是动态请求,本身根据实际把握
  1. 毕竟目前的一些框架的流行,带.php,.jsp后缀的状况不多了
location / {
    proxy_pass http://tomcat:8080/
}

防盗链

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
         rewrite ^/ http://$host/logo.png;
    }
}

根据文件类型设置过时时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
     if (-f $request_filename) {
         expires 1h;
         break;
     }
}

禁止访问某个目录

location ~* \.(txt|doc)${
    root /data/www/wwwroot/linuxtone/test;
    deny all;
}

ReWrite

last – 基本上都用这个Flag。

break – 停止Rewirte,不在继续匹配

redirect – 返回临时重定向的HTTP状态302

permanent – 返回永久重定向的HTTP状态301

1、下面是能够用来判断的表达式:

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

2、下面是能够用做判断的全局变量

例:http://localhost:88/test1/test2/test.php

$host:localhost

$server_port:88

$request_urihttp://localhost:88/test1/test2/test.php

$document_uri:/test1/test2/test.php

$document_root:D:\nginx/html

$request_filename:D:\nginx/html/test1/test2/test.php

 

一些可用的全局变量:

Ø  $args

Ø  $content_length

Ø  $content_type

Ø  $document_root

Ø  $document_uri

Ø  $host

Ø  $http_user_agent

Ø  $http_cookie

Ø  $limit_rate

Ø  $request_body_file

Ø  $request_method

Ø  $remote_addr

Ø  $remote_port

Ø  $remote_user

Ø  $request_filename

Ø  $request_uri

Ø  $query_string

Ø  $scheme

Ø  $server_protocol

Ø  $server_addr

Ø  $server_name

Ø  $server_port

Ø  $uri

 

Redirect

server {
   listen 80;
   server_name start.igrow.cn;
   index index.html index.php;
   root html;
   if ($http_host !~ “^star\.igrow\.cn$&quot {
       rewrite ^(.*) http://star.igrow.cn$1 redirect;
   }
}
相关文章
相关标签/搜索