Nginx 常见应用技术攻略ITeye - 众发娱乐

Nginx 常见应用技术攻略ITeye

2019年02月18日07时04分08秒 | 作者: 昌茂 | 标签: 文件,效劳,目录 | 浏览: 2935

作者:NetSeek   (IT运维专家网|集群架构|功用调优)
欢迎转载,转载时请有必要以超链接方法标明文章原始出处和作者信息及本声明.
首发时刻: 2008-11-25     更新时刻:2009-1-14

 

NGINX 运转参数

  nginx -s stop         快速封闭nginx,或许不保存相关信息,并敏捷中止web效劳
  nginx -s quit         平稳封闭nginx,保存相关信息,有组织的结束web效劳。
  nginx -s reload       因改变了nginx相关装备,需求从头加载装备而重载。
  nginx -s reopen       从头翻开日志文件
  nginx -t              不运转,而只是测验装备文件。

 

目 录
一、        Nginx 根底知识
二、        Nginx 装置及调试
三、        Nginx Rewrite
四、        Nginx Redirect
五、        Nginx 目录主动加斜线:
六、        Nginx Location
七、        Nginx expires
八、        Nginx 防盗链
九、        Nginx 拜访操控
十、        Nginx日志处理
十一、     Nginx Cache
十二、      Nginx负载均衡
十三、       Nginx简略优化       
十四、        怎么构建高功用的LEMP环境
十五、        Nginx效劳监控
十六、        常见问题与过错处理.
十七、        相关资源下载

【前语】:
编写此技能攻略在于推行遍及NGINX在国内的运用,更便利的协助我们了解和把握NGINX的一些运用技巧。本攻略许多技 巧来自于网络和作业中或网络上朋友们问我的问题.在此对网络上情愿共享的朋友们表明感谢和致意!欢迎我们和我一同丰厚本技能攻略提出更好的主张!请朋友们 重视: 技能共享社区! 互想学习共同进步!

一、 Nginx 根底知识 1、简介
   Nginx ("engine x") 是一个高功用的 HTTP 和 反向署理 效劳器,也是一个 IMAP/POP3/SMTP 署理效劳器。 Nginx 是由 Igor Sysoev 为俄罗斯拜访量第二的 Rambler.ru 站点开发的,它现已在该站点运转超越两年半了。Igor 将源代码以类BSD许可证的方法发布。尽管仍是测验版,可是,Nginx 现已由于它的稳定性、丰厚的功用集、示例装备文件和低系统资源的耗费而出名了。
更多的请见官方wiki:

2、 Nginx的长处
nginx做为HTTP效劳器,有以下几项根本特性:
1)        处理静态文件,索引文件以及主动索引;翻开文件描述符缓冲.
2)        无缓存的反向署理加快,简略的负载均衡和容错.
3)        FastCGI,简略的负载均衡和容错.
4)        模块化的结构。包含gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。假如由FastCGI或其它署理效劳器处理单页中存在的多个SSI,则这项处理能够并行运转,而不需求彼此等候。
5)        支撑SSL 和 TLS SNI .

Nginx专为功用优化而开发,功用是其最重要的考量, 完结上十分重视功率 。它支撑内核Poll模型,能饱尝高负载的检测, 有陈述标明能支撑高达 50,000 个并发衔接数。
Nginx具有很高的稳定性。其它HTTP效劳器,当遇到拜访的峰值,或许有人歹意建议慢速衔接时,也很或许会导致效劳器物理内存耗尽频频交流,失掉响 应,只能重启效劳器。例如当时apache一旦上到200个以上进程,web呼应速度就显着十分缓慢了。而Nginx采取了分阶段资源分配技能,使得它的 CPU与内存占用率十分低。nginx官方表明坚持10,000个没有活动的衔接,它只占2.5M内存,所以相似DOS这样的进犯对nginx来说根本上 是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。
Nginx支撑热布置。它的发动特别简略, 而且简直能够做到7*24不间断运转,即便运转数个月也不需求从头发动。你还能够在不间断效劳的状况下,对软件版别进行进行晋级。
Nginx选用master-slave模型, 能够充分运用SMP的优势,且能够削减作业进程在磁盘I/O的堵塞推迟。当选用select()/poll()调用时,还能够约束每个进程的衔接数。
Nginx代码质量十分高,代码很标准, 办法老练, 模块扩展也很简略。特别值得一提的是强壮的Upstream与Filter链。 Upstream为比如reverse proxy, 与其他效劳器通讯模块的编写奠定了很好的根底。而Filter链最酷的部分就是各个filter不必等候前一个filter履行结束。它能够把前一个 filter的输出做为当时filter的输入,这有点像Unix的管线。这意味着,一个模块能够开端紧缩从后端效劳器发送过来的恳求,且能够在模块接纳 完后端效劳器的整个恳求之前把紧缩流转向客户端。
Nginx选用了一些os供给的最新特性如对sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支撑,然后大大进步了功用

二、 Nginx 装置及调试 1、Pcre 装置

./configure
   make make install
   cd ../

2.        nginx 编译装置

./configure user=www group=www prefix=/usr/local/nginx/ with-http_stub_status_module with-openssl=/usr/local/openssl
make make install

更具体的模块定制与装置请参照官方wiki.

3、Nginx 装备文件测验:

# /usr/local/nginx/sbin/nginx -t  //Debug 装备文件的要害指令需求要点撑握.

2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully

3、Nginx 发动:

# /usr/local/nginx/sbin/nginx

4、Nginx 装备文件修正从头加载:

# kill -HUP `cat /usr/local/nginx/logs/nginx.pid

`
三、Nginx Rewrite

1.  Nginx Rewrite 根本符号(flags)
last - 根本上都用这个Flag。
※相当于Apache里的[L]符号,表明完结rewrite,不再匹配后边的规矩
break - 间断Rewirte,不再持续匹配
redirect - 回来暂时重定向的HTTP状况302
permanent - 回来永久重定向的HTTP状况301       ※原有的url支撑正则  重写的url不支撑正则

2.  正则表达式匹配,其间:
    * ~         为区别巨细写匹配
    * ~*       为不区别巨细写匹配
    * !~和!~*   分别为区别巨细写不匹配及不区别巨细写不匹配

3. 文件及目录匹配,其间:
   * -f和!-f用来判别是否存在文件
    * -d和!-d用来判别是否存在目录
    * -e和!-e用来判别是否存在文件或目录
    * -x和!-x用来判别文件是否可履行


3.  Nginx 的一些可用的全局变量,可用做条件判别:

$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



四、 Nginx Redirect 将一切linuxtone.org与netseek.linuxtone.org域名悉数自跳转到

server
{
listen 80;
server_name linuxtone.org netseek.linuxtone.org;
index index.html index.php;
root /data/www/wwwroot;
if ($host !~ "^www\.linxtone\.org$") {
rewrite ^(.*) http://www.linuxtone.org$1 redirect;
}
........................


五、 Nginx 目录主动加斜线: if (-d $request_filename){
            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
      }

六  Nginx Location

1.根本语法:[和上面rewrite正则匹配语法根本共同]
location [=|~|~*|^~] /uri/ { … }     * ~  为区别巨细写匹配
    * ~* 为不区别巨细写匹配
    * !~和!~*分别为区别巨细写不匹配及不区别巨细写不匹配

示例1:
location = / {
# matches the query / only.
# 只匹配 / 查询。
}
匹配任何查询,由于一切恳求都已 / 最初。可是正则表达式规矩和长的块规矩将被优先和查询匹配

示例2:
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked. # 匹配任何已 /images/ 最初的任何查询而且中止查找。任何正则表达式将不会被测验。

示例3:
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
}
# 匹配任何已 gif、jpg 或 jpeg 结束的恳求。


七、 Nginx expires

1.依据文件类型expires

# Add expires header for static content
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
     if (-f $request_filename) {
        root /data/www/wwwroot/bbs;
        expires      1d;
        break;
     }

2、依据判别某个目录

# serve static files
  location ~ ^/(images|javascript|js|css|flash|media|static)/  {
  root    /data/www/wwwroot/down;
         expires 30d;

八、  Nginx 防盗链

1.        针对不同的文件类型

#Preventing hot linking of images and other file types
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
if ($invalid_referer) {
       rewrite   ^/   ;
      # return   403;
       }

2.        针对不同的目录

location /img/ {
     root /data/www/wwwroot/bbs/img/;
     valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
     if ($invalid_referer) {
                    rewrite  ^/  ;
                    #return   403;
     }

3.        同完结防盗链和expires的办法

#Preventing hot linking of images and other file types
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
         valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
if ($invalid_referer) {
       rewrite   ^/   ;
                      }
      access_log off;
      root /data/www/wwwroot/bbs;
expires 1d;
      break;

九、 Nginx 拜访操控

1.        Nginx 身份证验证

#cd /usr/local/nginx/conf
#mkdir htpasswd
/usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone
#添加用户名为linuxtone
New password:   (此处输入你的暗码)
Re-type new password:   (再次输入你的暗码)
Adding password for user
http://count.linuxtone.org/tongji/data/index.html(目录存在/data/www/wwwroot/tongji/data/目录下)
将下段装备放到虚拟主机目录,当拜访http://count.linuxtone/tongji/即提示要密验证:
location ~ ^/(tongji)/  {
                 root    /data/www/wwwroot/count;
                         auth_basic              "LT-COUNT-TongJi";
                         auth_basic_user_file  /usr/local/nginx/conf/htpasswd/tongji;
                 }

2.        Nginx 制止拜访某类型的文件.
如,Nginx下制止拜访*.txt文件,装备办法如下.

location ~* \.(txt|doc)$ {
    if (-f $request_filename) {
    root /data/www/wwwroot/linuxtone/test;
    #rewrite …..能够重定向到某个URL
    break;
    }

办法2:

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

实例:

制止拜访某个目录

location ~ ^/(WEB-INF)/ {
             deny all;

3.        运用ngx_http_access_module约束ip拜访

location / {
     deny    192.168.1.1;
     allow   192.168.1.0/24;
     allow   10.1.1.0/16;
     deny    all;

具体拜见wiki:

4.        Nginx 下载约束并发和速率

limit_zone   linuxtone  $binary_remote_addr  10m;
server
        {
                listen       80;
                server_name  down.linuxotne.org;
                index index.html index.htm index.php;
                root   /data/www/wwwroot/down;
                #Zone limit
                location / {
                    limit_conn   linuxtone  1;
                    limit_rate  20k;
                }
..........
        }

只答应客房端一个线程,每个线程20k.
【注】limit_zone   linuxtone  $binary_remote_addr  10m; 这个能够界说在主的


5.        Nginx 完结Apache相同目录列表

location  /  {
     autoindex  on;

6.        上文件巨细约束
主装备文件里参加如下,具体巨细依据你自己的事务做调整。
client_max_body_size 10m;                                                         

十、        Nginx 日志处理

1.Nginx 日志切开
#contab -e
59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2 1
[root@count ~]# cat /usr/local/sbin/logcron.sh #!/bin/bash
log_dir="/data/logs"
time=`date +%Y%m%d`  
/bin/mv  ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
kill -USR1 `cat  /var/run/nginx.pid`

更多的日志剖析与处理就重视(一起欢迎你参加评论):

2.运用AWSTATS剖析NGINX日志
  设置好Nginx日志格局,仍后运用awstats进行剖析.
请参阅:

3.        Nginx 怎么不记载部分日志
日志太多,每天好几个G,少记载一些,下面的装备写到server{}段中就能够了
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
     access_log off;
}

十一、Nginx Cache效劳装备

假如需求将文件缓存到本地,则需求添加如下几个子参数:

proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path 缓存目录;

其间,
proxy_store on用来启用缓存到本地的功用,
proxy_temp_path用来指定缓存在哪个目录下,如:proxy_temp_path html;

在经过上一步装备之后,尽管文件被缓存到了本地磁盘上,但每次恳求仍会向远端拉取文件,为了防止去远端拉取文件,有必要修正

proxy_pass:
if ( !-e $request_filename) {
     proxy_pass  http://mysvr;

即改成有条件地去履行proxy_pass,这个条件就是当恳求的文件在本地的proxy_temp_path指定的目录下不存在时,再向后端拉取。

   
更多更高档的运用能够研讨ncache,具体请参照 里ncache相关的贴子.

十二、Nginx 负载均衡 1. Nginx 负载均衡根底知识
nginx的upstream现在支撑4种方法的分配
1)、轮询(默许)
每个恳求按时刻次序逐个分配到不同的后端效劳器,假如后端效劳器down掉,能主动除掉。
2)、weight
指定轮询几率,weight和拜访比率成正比,用于后端效劳器功用不均的状况。
2)、ip_hash
每个恳求按拜访ip的hash成果分配,这样每个访客固定拜访一个后端效劳器,能够处理session的问题。
3)、fair(第三方)
按后端效劳器的呼应时刻来分配恳求,呼应时刻短的优先分配。
4)、url_hash(第三方)

2.        Nginx 负载均衡实例1

upstream bbs.linuxtone.org {#界说负载均衡设备的Ip及设备状况
     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 ;

每个设备的状况设置为:
a)        down 表明单前的server暂时不参加负载
b)        weight 默许为1.weight越大,负载的权重就越大。
c)        max_fails :答应恳求失利的次数默许为1.当超越最大次数时,回来proxy_next_upstream 模块界说的过错
d)        fail_timeout:max_fails次失利后,暂停的时刻。
e)        backup: 其它一切的非backup机器down或许忙的时分,恳求backup机器。所以这台机器压力会最轻。

nginx支撑一起设置多组的负载均衡,用来给不必的server来运用。

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


3.        Nginx 负载均衡实例 2
按拜访url的hash成果来分配恳求,使每个url定向到同一个后端效劳器,后端效劳器为缓存时比较有用,也能够用作进步Squid缓存命中率.

简略的负载平等实例:
#vi nginx.conf  //nginx主装备文件中心装备

……….
#loadblance my.linuxtone.org
        upstream  my.linuxtone.org  {
        ip_hash;
        server   127.0.0.1:8080;
        server   192.168.169.136:8080;
        server   219.101.75.138:8080;
        server   192.168.169.117;
        server   192.168.169.118;
        server   192.168.169.119;
      }
…………..
include          vhosts/linuxtone_lb.conf;
………
# vi proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
  
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
proxy_store on;
proxy_store_access   user:rw  group:rw  all:r;
#nginx cache               
#client_body_temp_path  /data/nginx_cache/client_body 1 2;
proxy_temp_path /data/nginx_cache/proxy_temp 1 2;

#vi  linuxtone_lb.conf

server
     {
         listen  80;
         server_name my.linuxtone.org;
         index index.php;
         root /data/www/wwwroot/mylinuxtone;
         if (-f $request_filename) {
             break;
            }
         if (-f $request_filename/index.php) {
           rewrite (.*) $1/index.php break;
         }
  
         error_page 403 http://my.linuxtone.org/member.php?m=user a=login;
         location / {
            if ( !-e $request_filename) {
                proxy_pass http://my.linuxtone.org;
                break;
            }
            include /usr/local/nginx/conf/proxy.conf;
         }



十三、Nginx简略优化

1.        减小nginx编译后的文件巨细 (Reduce file size of nginx)
默许的nginx编译选项里居然是用debug形式(-g)的(debug形式会刺进许多盯梢和ASSERT之类),编译今后一个nginx有好几兆。去掉nginx的debug形式编译,编译今后只要几百K
在 auto/cc/gcc,最终几行有:
# debug

CFLAGS=”$CFLAGS -g”

注释掉或删掉这几行,从头编译即可。

2.        修正Nginx的header假装效劳器
1)        修正nginx.h

#vi nginx-0.7.30/src/core/nginx.h
#define NGINX_VERSION      "1.8"
#define NGINX_VER          "LTWS/" NGINX_VERSION

#define NGINX_VAR          "NGINX"
#define NGX_OLDPID_EXT     ".oldbin"

2) 修正nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
将如下

static char ngx_http_server_string[] = "Server: nginx" CRLF;

修正为

static char ngx_http_server_string[] = "Server: LTWS" CRLF;

a)        修正nginx_http_header_filter_module
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
将如下:

static u_char ngx_http_error_full_tail[] =
" hr center " NGINX_VER " /center " CRLF
" /body " CRLF
" /html " CRLF
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章