Error[8]: Undefined offset: 160, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

别拿Nginx基础当秘籍

一、Nginx简介

    Nginx是什么?

    Nginx跟Apache一样都是提供Web服务功能的软件,但却通过nginx模块提供了比Apache更多更强大的功能。它采用的是事件驱动结构,使用异步套接字来接收客户端请求,是一种非阻塞结构,不使用单独的线程处理,极大的减少了服务器内存和CPU的开销

    Nginx的基本功能

        提供静态资源的web服务器,能缓存打开的文件文件描述符

        支持http、smtp、pop3协议的反向代理服务器

        支持缓存和简单的负载均衡和容错

        支持FastCGI

        支持高度模块化定制,但不支持DSO机制

        支持SSL

    Nginx的扩展功能

        支持基于名称和基于IP的虚拟主机

        支持KeepAlive

        支持平滑升级

        支持访问日志定制

        支持URL重写

        支持路径别名

        支持基于IP和基于用户的访问控制

        支持速率控制和并发数限制

    Nginx与Apache相比,最大的优势在于其较低的内存消耗上,据说1w个keepalive连接仅消耗2.5M内存。总之,Nginx能满足你所有需求。官方文档:http://nginx.org/en/docs/

Nginx的基本框架

一个master进程生成一个或多个worker进程,每个worker基于事件驱动(epoll机制)、消息通知机制响应N个http请求

附:Nginx高度概述框架

二、Nginx 1.6.2版本的编译安装

    Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同 *** 作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。下面为读者朋友详解一下,Nginx-1.6.2版本的编译安装。

    从官网下载好源码包并解压到/usr/src目录中:tar xf nginx-1.6.2.tar.gz -C /usr/src

    为防止编译安装过程中出现问题,yum安装Development Tools和Server Platform Development包组

    添加nginx系统组:groupadd -r nginx

    添加nginx系统用户:useradd -g nginx -r nginx

    切换到nginx的解压目录中,准备执行编译安装相关 *** 作:cd /usr/src/nginx-1.6.2/;建议编译安装之前先使用./configure --help 根据自己的需求添加模块。

    编译安装

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error_log  --http-log-path=/var/log/nginx/access_log --pid-path=/var/run/nginx/nginx.pid  --with-http_ssl_module  --with-http_gzip_static_module  --with-http_stub_status_module  --with-http_mp4_module  --http-proxy-temp-path=/var/tmp/nginx/proxy  --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-client-body-temp-path=/var/tmp/nginx/client --with-pcre

注:若出现编译错误,大多数是缺少对应模块功能的开发包,比如--with-pcre,若事先没有安装支持正则表示式的开发包pcre-devel,很有可能会报错。

make

make install

为nginx提供服务脚本

vim /etc/init.d/nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

#Nginx程序路径 
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

#Nginx配置文件路径 
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*//g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
   if [ `echo $opt | grep '.*-temp-path'` ]; then
   value=`echo $opt | cut -d "=" -f 2`
   if [ ! -d "$value" ]; then
   # echo "creating" $value
   mkdir -p $value && chown -R $user $value
   fi
   fi
   done
}
 
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
 
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
 
restart() {
configtest || return $?
stop
sleep 1
start
}
 
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
 
force_reload() {
restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
status $prog
}
 
rh_status_q() {
rh_status >/dev/null 2>&1
}
 
case "" in
start)
rh_status_q && exit 0

;;
stop)
rh_status_q || exit 0

;;
restart|configtest)

;;
reload)
rh_status_q || exit 7

;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: chmod +x /etc/init.d/nginx {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

将服务脚本的权限设置为可执行:chkconfig --add nginx && chkconfig nginx on

将服务加入服务列表中,并设置为开机自启动:nginx:service nginx start

测试启动三、Nginx常用配置(配置文件/etc/nginx/nginx.conf)

 

                                            

    Nginx的主配置文件由main、http、mail等几个段组成,这些个段通常也被称为Nginx的上下文,每个段的配置格式如下所示:

                                                <section> {

                                        <directive> <parameters>;

;}

    需要注意的是,其每一个指令都必须使用分号(main配置段的常用参数)结束,否则视为语法错误。

    A、保证Nginx正常运行的相关配置:

user USERNAME GROUP

    pid /PATH/TO/PID_FILE  指定运行worker进程的用户和组,如果在编译中没有指定,需将注释去掉,以nobody身份运行worker进程

    worker_rlimit_nofile  指定Nginx的pid文件,如果在编译中没有指定,需要在main配置段中定义

    NUM   worker_rlimit_sigpending 设定worker进程所能够打开的文件描述符个数的最大值。

    NUM  B、优化性能的相关配置指定每个用户能够发往worker进程的信号的数量

        worker_process NUM

worker_cpu_affinity CPUMASK……  设定master进程启动的worker进程数,具体需要看CPU的核心数,生产环境中常将其设置为cpu核心数减1

                                 绑定worker进程至指定CPU上,如:

                                    worker_processes     4;

timer_resolution INTERVALworker_cpu_affinity 0001 0010 0100 1000;

    worker_priority nice_NUM 设定更新缓存的时间间隔,如:timer_resolution  100ms;

    C、事件event相关的配置(以下配置需写在event {……}中) 设定worker进程运行的优先级(按nice值设置),默认为0;如:worker_priority -20

    worker_connections NUM  

                                 每个worker进程所能够响应的最大并发请求数,它与worker_processes共同决定能响应的最大客户数maxclients的值。

                                    maxclients = worker_processes * worker_connections

    而在反向代理场景中,其计算方法与上述公式不同,因为默认情况下浏览器将打开2个连接,而nginx会为每一个连接打开2个文件描述符,因此,其maxclients的计算方法为:

    accept_mutex on|offmaxclients = worker_processes * worker_connections/4

lock_file /PATH/TO/LOCK_FILE 是否打开Nginx的负载均衡锁,设为on时,能使多个worker进程轮流地、序列化地与响应新请求

        accept_mutex_delay INTERVAL 负载均衡锁的路径

use epoll|rgsig|select|poll 等待负载均衡锁的时间间隔

        D、用于调试、定位问题的相关配置 设定worker进程使用的事件模型IO,建议让Nginx自动选择

    daemon off|on

master_process on|of  是否以守护进程的方式启动nginx,定位问题时设为off,正常环境为on

    f    error_log /PATH/TO/error_log debug|info|notice|warn|error|crit|alert|emerg  是否以master/worker模型来运行nginx

http {
    upstreamserver {
            ....
    }
    server {
        #定义虚拟主机
        listen IP:PORT;
        server_name SER_NAME
        location /URL {
            if ...{
                ...
            }
        root "/path/to/somewhere";
        ...
        }
    }
    server {
        ……
    }
}
 设定错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;要禁用错误日志,不能使用“error_log off;”,而要使用类似如下选项:                                             error_log /dev/null crit


http上下文专用于配置用于http的各模块,此类指令非常的多,每个模块都有其专用指定。其配置框架:

http配置段的常用参数

注:与http配置相关的指令必须放在http、server、location、upstream、if块中

A、虚拟主机的相关配置

        server {……}

listen IP_ADDR [:port] [default_server] 用于定义一个虚拟主机

        server_name Serv_NAME…… 设定监听的端口号,可以省略IP和port其中之一,还可以添加default_server参数将其设置成默认服务器,用于匹配客户端的host请求

    location [=|~|~*|^~] /URI {……} 设定主机名,后可跟多个主机名,主机名称还可以使用通配符和正则表达式(要以~开头)

注:其匹配次序为:

 

~、~* 允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,location可以嵌套

其中=表示精确匹配

    ^~都表示正则表达式模式匹配,只是前者在匹配时区分字符大小写

    root表示作URI左半部分匹配,匹配时不检查正则表达式

注:其匹配次序:

处于同一优先级的URI,排在前面的先被匹配

设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径;如:

                        location /p_w_picpaths/ {

                                    root "/web/imgs/";

alias }

    定义路径别名,

                         location /p_w_picpaths/ {

        root "/web/imgs/";

index }

注:root表示路径为对应location的“ /” URL;alias表示路径映射,即location中的URL是相对于alias后所设定的路径而言

error_page STATUS …… URL设定默认的主页面

error_page STATUS=NEW_STATUS URL 根据http状态码重定向至错误页面

                 以指定的状态码响应客户端

如:                 server {

                        listen       80;

                        server_name  www.stu24.com;

        location / {

                             root   html;

                                            index  index.html index.htm;

                        }

                        error_page   500 502 503 504  /50x.html;

                            location = /50x.html {

                            root   html;

                }

    B、网络连接相关的配置}

 keepalive_timeout TIMEOUT

   keepalive_requests NUM  长连接的超时时长,默认为75s

     keepalive_disable [msie6|safari|none]在一次长连接上允许承载最大资源请求数

      tcp_nodelay on|off 在某些浏览器上禁用保持连接

 client_header_timeout TIMEOUT 是否对长连接使用tcp_nodelay选项,开启之后能有效的提高数据的实时响应性。

    client_body_timeout TIMEOUT 读取http Request报文首部的超时时长

    send_timeout TIMEOUT 读取http Request报文body部分的超时时长

    C、对客户端请求进行限制的相关配置读取http Response报文的超时时长

    

    limit_except METHOD {...} 通过limit_except后面指定的方法名来限制用户请求,如:

limit_except GET {

allow 172.16.0.0/16;

deny all;

}

client_body_max_size SIZE

    limit_rate SPEED 限制请求报文中body部分的上限,通过检测请求报文首部中的"Content_Length"来判定,例如,用户试图上传一个10GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413 ("Request Entity Too Large")响应给客户端

    D、对内存或磁盘资源进行分配 限制客户端每秒种传输的字节数,默认为0,表示无限制;

        client_body_in_file_only on|clean|off

client_body_in_single_buffer on|off 请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off(默认)不允许暂存; 

     请求报文的body部分是否可暂存于内存buffer中。当然,如果HTTP包体的大小超过了下面client_body_buffer_size设置的值,包体还是会写入到磁盘文件中client_body_buffer_size size

    client_body_temp_path DIR [level1 [level2 [level3 [level4]]]] 设定内存buffer的大小

    client_header_buffer_size SIZE 请求报文的body部分的临时存放目录,在接收HTTP包体时,如果包体的大小大于client_body_buffer_size,则会以一个递增的整数命名并存放到client_body_temp_path指定的目录中。后面跟着的level1、level2、level3,是为了防止一个目录下的文件数量太多,从而导致性能下降,因此使用了level参数,这样可以按照临时文件名最多再加三层目录。例如:client_body_temp_path /var/tmp/nginx/client  1 2

    E、MIME类型相关的配置 存储超大HTTP头部的内存buffer大小

        types {……}

定义MIME types至文件的扩展名;例如:

types {

text/html .html;

p_w_picpath/jpeg  .jpg;

default_type MIME-TYPE }

    F、文件 *** 作优化相关的配置当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME-TYPE作为HTTP header中的Content-Type

        sendfile on|off

aio on|off 是否启用sendfile系统调用来发送文件,设为on,表示减少内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。

    directio size|off  是否启用异步I/O,与sendfile功能互斥

        open_file_cache max=N[inactive=time]|off是否使用O_DIRECT选项去请求读取文件,与sendfile功能互斥;

是否打开文件缓存

nginx可以缓存以下三种信息:

(1) 文件句柄、文件大小和最近一次修改时间;

(2) 打开目录的目录结构;

open_file_cache_errors on|off(3) 没有找到的或者没有权限 *** 作的文件的相关信息;

max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;

inactive=time: 在inactive指定的时长内没有被访问过的缓存条目就会淘汰;

如:open_file_cache max=1000 inactive=20s;

        open_file_cache_min_uses INTERVAL 是否缓存打开文件错误的信息

    Nginx优化相关配置检查一次缓存中缓存条目有效性的时间间隔;默认60s;

    讲了一大堆,其实我们重点关注以下几项就足以应付生产环境中的需求了:

server{}, location{}, listen, server_name, root, alias, keepalive_timeout,keepalive_requests, error_page

    A、基于IP的访问控制

allow, deny

    在http, server, location中使用B、基于用户的basic认证配置指令定义,匹配法则类似于iptables,自上而下依次匹配,如:

                        location / {

                            deny  192.168.1.1;

                            allow 192.168.1.0/24;

                            allow 10.1.1.0/16;

                            deny  all;

                        }

    auth_basic "AUTH_NAME"

    auth_basic_user_file /PATH/TO/PASSWD_FILE

             ,建议使用htpasswd命令创建用户账号文件;

例如:

                        location /wp-login.php {

                            auth_basic 'Welcome WordPress';

                            auth_basic_user_file  /home/mypwd/pass;

                        }C、基于gzip实现响应报文压缩 

    gzip on|off

    gzip_http_version 1.1|1.0  是否开启gzip压缩,开启之后节省网络带宽,却增加了服务器CPU的开销

    gzip_min_length LENGTH   设定启用gzip压缩时客户端请求使用的http协议版本号

    gzip_buffers NUM SIZE设定最小压缩的页面,注:若页面过小,可能导致页面越压越大,单位为B,如:gzip_min_length 1024

    gzip_comp_level 3 设定存储压缩后的响应报文的缓存区数量及大小,默认为一个页面的大小,具体大小依赖于系统平台,不是4K就是8K(getconf PAGE_SIZE 获取系统内存页面大小),例如:gzip_buffers 4 8k

    gzip_types MIME_TYPE 设定gzip的压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,一般设置为3就可以了

    gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any]设定gzip压缩的MIME类型

    

                gzip on;
                gzip_comp_level 3;
                gzip_buffers 4 8k;
                gzip_http_version 1.1;
                gzip_disable "MSIE [1-6]";
                gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php p_w_picpath/jpeg p_w_picpath/gif p_w_picpath/png;
根据某些请求和应答来决定是否在对代理请求的应答启用压缩,代理请求取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数:

                            off 为所有代理请求禁用压缩。

                            expired 当“Expires”头禁用缓存时启用压缩。

                            no-cache 当“Cache-Control”头设置为no-cache时启用压缩。

                            no-store  当“Cache-Control”头设置为no-store时启用压缩。

                            private  当“Cache-Control”头设置为private时启用压缩。

                            no_last_modified  当“Last-Modified”没有定义时启用压缩。

                            no_etag  没有“ETag”头时启用压缩。

                            auth 当有一个“Authorization”头时启用压缩。

                            any  为所有请求启用压缩。

                            gzip_disable 设定在某些浏览器上不启用gzip压缩

gzip使用实例:

D、定制响应首部

    add_header key value [always]

    expires TIME,如:add_header  Content-Type 'text/html; charset=utf-8';

    

                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
                           expires 30d;
                 }
,设定缓存时间 如:

E、定制访问日志

    log_format NAME LOG_FORMAT 

    access_log 设置日志的记录格式,

    

log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /var/log/access.log   access
指定日志文件的存放路径、格式和缓存大小,也可以使用off关闭日志功能,如:

F、定义合法引用,防盗链

        $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

        $remote_user  用来记录客户端用户名称;

        $time_local    用来记录访问时间与时区;

        $request   用来记录请求的url与http协议;

        $status   用来记录请求状态;成功是200,

        $body_bytes_sent  记录发送给客户端文件主体内容大小;

        $http_referer  用来记录从那个页面链接访问过来的;

        $http_user_agent  记录客户端浏览器的相关信息;

    valid_referers none | blocked | server_names | string ...

    

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
                    valid_referers none blocked www.stu24.com stu24.com;
                    if ($invalid_referer){
                               return 403;
                    }
}
如:

    G、定义路径重写,与正则表达式结合if判断使用

rewrite regex replacement [flag]

    if (condition) {

flag标记有四种格式:

            last 相当于Apache中的L

            break 中止Rewirte,不在继续匹配

            redirect  返回临时重定向的HTTP状态302,相当于Apache中的R

            permanent 返回永久重定向的HTTP状态301,相当于Apache中的R=301

    

    }...

        return STATUS URL 

条件conditon可以是如下任何内容:

            一个变量名;false如果这个变量是空字符串或者以0开始的字符串;

            使用= ,!= 比较的一个变量和字符串

            使用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围

            使用-f ,!-f 检查一个文件是否存在

            使用-d, !-d 检查一个目录是否存在

            使用-e ,!-e 检查一个文件、目录、符号链接是否存在

            使用-x , !-x 检查一个文件是否可执行

    set VARIABLE VALUE 结束规则时执行并返回状态码给客户端

    if ($host != 'www.stu24.com' ) {
        rewrite ^/(.*)$ http://www.stu24.com/ permanent;
    }
定义一个变量,并给变量赋值

例如:将访问的URL是 stu24.com重定向为www.stu24.com

[+++]


附录:nginx有以下内置变量

    $args, 请求中的参数;

    $content_length, HTTP请求信息里的"Content-Length";

    $content_type, 请求信息里的"Content-Type";

    $document_root, 针对当前请求的根路径设置值;

    $document_uri, 与$uri相同;

    $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

    $limit_rate, 对连接速率的限制;

    $request_method, 请求的方法,比如"GET"、"POST"等;

    $remote_addr, 客户端地址;

    $remote_port, 客户端端口号;

    $remote_user, 客户端用户名,认证用;

    $request_filename, 当前请求的文件路径名

    $request_uri, 请求的URI,带查询字符串;

    $query_string, 与$args相同;

    $scheme, 所用的协议,比如http或者是https,比如:

    rewrite ^(.+)$  $scheme://example.com$1  redirect;

    $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

    $server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);

    $server_name, 请求到达的服务器名;

    $server_port, 请求到达的服务器端口号;

    $uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

这些变量可以用在rewrite规则里,也可以打印日志的时候用

部分内容引用《深入理解nginx:模块开发与架构解析》

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
秘诀与秘籍的区别_服务器_内存溢出

秘诀与秘籍的区别

秘诀与秘籍的区别,第1张

别拿Nginx基础当秘籍

一、Nginx简介

    Nginx是什么?

    Nginx跟Apache一样都是提供Web服务功能的软件,但却通过nginx模块提供了比Apache更多更强大的功能。它采用的是事件驱动结构,使用异步套接字来接收客户端请求,是一种非阻塞结构,不使用单独的线程处理,极大的减少了服务器内存和CPU的开销

    Nginx的基本功能

        提供静态资源的web服务器,能缓存打开的文件文件描述符

        支持http、smtp、pop3协议的反向代理服务器

        支持缓存和简单的负载均衡和容错

        支持FastCGI

        支持高度模块化定制,但不支持DSO机制

        支持SSL

    Nginx的扩展功能

        支持基于名称和基于IP的虚拟主机

        支持KeepAlive

        支持平滑升级

        支持访问日志定制

        支持URL重写

        支持路径别名

        支持基于IP和基于用户的访问控制

        支持速率控制和并发数限制

    Nginx与Apache相比,最大的优势在于其较低的内存消耗上,据说1w个keepalive连接仅消耗2.5M内存。总之,Nginx能满足你所有需求。官方文档:http://nginx.org/en/docs/

Nginx的基本框架

一个master进程生成一个或多个worker进程,每个worker基于事件驱动(epoll机制)、消息通知机制响应N个http请求

附:Nginx高度概述框架

二、Nginx 1.6.2版本的编译安装

    Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同 *** 作系统的事件机制有所不同)事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端建立会话。下面为读者朋友详解一下,Nginx-1.6.2版本的编译安装。

    从官网下载好源码包并解压到/usr/src目录中:tar xf nginx-1.6.2.tar.gz -C /usr/src

    为防止编译安装过程中出现问题,yum安装Development Tools和Server Platform Development包组

    添加nginx系统组:groupadd -r nginx

    添加nginx系统用户:useradd -g nginx -r nginx

    切换到nginx的解压目录中,准备执行编译安装相关 *** 作:cd /usr/src/nginx-1.6.2/;建议编译安装之前先使用./configure --help 根据自己的需求添加模块。

    编译安装

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error_log  --http-log-path=/var/log/nginx/access_log --pid-path=/var/run/nginx/nginx.pid  --with-http_ssl_module  --with-http_gzip_static_module  --with-http_stub_status_module  --with-http_mp4_module  --http-proxy-temp-path=/var/tmp/nginx/proxy  --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-client-body-temp-path=/var/tmp/nginx/client --with-pcre

注:若出现编译错误,大多数是缺少对应模块功能的开发包,比如--with-pcre,若事先没有安装支持正则表示式的开发包pcre-devel,很有可能会报错。

make

make install

为nginx提供服务脚本

vim /etc/init.d/nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

#Nginx程序路径 
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

#Nginx配置文件路径 
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*//g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
   if [ `echo $opt | grep '.*-temp-path'` ]; then
   value=`echo $opt | cut -d "=" -f 2`
   if [ ! -d "$value" ]; then
   # echo "creating" $value
   mkdir -p $value && chown -R $user $value
   fi
   fi
   done
}
 
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
 
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
 
restart() {
configtest || return $?
stop
sleep 1
start
}
 
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
 
force_reload() {
restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
status $prog
}
 
rh_status_q() {
rh_status >/dev/null 2>&1
}
 
case "" in
start)
rh_status_q && exit 0

;;
stop)
rh_status_q || exit 0

;;
restart|configtest)

;;
reload)
rh_status_q || exit 7

;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: chmod +x /etc/init.d/nginx {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

将服务脚本的权限设置为可执行:chkconfig --add nginx && chkconfig nginx on

将服务加入服务列表中,并设置为开机自启动:nginx:service nginx start

测试启动三、Nginx常用配置(配置文件/etc/nginx/nginx.conf)

 

                                            

    Nginx的主配置文件由main、http、mail等几个段组成,这些个段通常也被称为Nginx的上下文,每个段的配置格式如下所示:

                                                <section> {

                                        <directive> <parameters>;

;}

    需要注意的是,其每一个指令都必须使用分号(main配置段的常用参数)结束,否则视为语法错误。

    A、保证Nginx正常运行的相关配置:

user USERNAME GROUP

    pid /PATH/TO/PID_FILE  指定运行worker进程的用户和组,如果在编译中没有指定,需将注释去掉,以nobody身份运行worker进程

    worker_rlimit_nofile  指定Nginx的pid文件,如果在编译中没有指定,需要在main配置段中定义

    NUM   worker_rlimit_sigpending 设定worker进程所能够打开的文件描述符个数的最大值。

    NUM  B、优化性能的相关配置指定每个用户能够发往worker进程的信号的数量

        worker_process NUM

worker_cpu_affinity CPUMASK……  设定master进程启动的worker进程数,具体需要看CPU的核心数,生产环境中常将其设置为cpu核心数减1

                                 绑定worker进程至指定CPU上,如:

                                    worker_processes     4;

timer_resolution INTERVALworker_cpu_affinity 0001 0010 0100 1000;

    worker_priority nice_NUM 设定更新缓存的时间间隔,如:timer_resolution  100ms;

    C、事件event相关的配置(以下配置需写在event {……}中) 设定worker进程运行的优先级(按nice值设置),默认为0;如:worker_priority -20

    worker_connections NUM  

                                 每个worker进程所能够响应的最大并发请求数,它与worker_processes共同决定能响应的最大客户数maxclients的值。

                                    maxclients = worker_processes * worker_connections

    而在反向代理场景中,其计算方法与上述公式不同,因为默认情况下浏览器将打开2个连接,而nginx会为每一个连接打开2个文件描述符,因此,其maxclients的计算方法为:

    accept_mutex on|offmaxclients = worker_processes * worker_connections/4

lock_file /PATH/TO/LOCK_FILE 是否打开Nginx的负载均衡锁,设为on时,能使多个worker进程轮流地、序列化地与响应新请求

        accept_mutex_delay INTERVAL 负载均衡锁的路径

use epoll|rgsig|select|poll 等待负载均衡锁的时间间隔

        D、用于调试、定位问题的相关配置 设定worker进程使用的事件模型IO,建议让Nginx自动选择

    daemon off|on

master_process on|of  是否以守护进程的方式启动nginx,定位问题时设为off,正常环境为on

    f    error_log /PATH/TO/error_log debug|info|notice|warn|error|crit|alert|emerg  是否以master/worker模型来运行nginx

http {
    upstreamserver {
            ....
    }
    server {
        #定义虚拟主机
        listen IP:PORT;
        server_name SER_NAME
        location /URL {
            if ...{
                ...
            }
        root "/path/to/somewhere";
        ...
        }
    }
    server {
        ……
    }
}
 设定错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;要禁用错误日志,不能使用“error_log off;”,而要使用类似如下选项:                                             error_log /dev/null crit


http上下文专用于配置用于http的各模块,此类指令非常的多,每个模块都有其专用指定。其配置框架:

http配置段的常用参数

注:与http配置相关的指令必须放在http、server、location、upstream、if块中

A、虚拟主机的相关配置

        server {……}

listen IP_ADDR [:port] [default_server] 用于定义一个虚拟主机

        server_name Serv_NAME…… 设定监听的端口号,可以省略IP和port其中之一,还可以添加default_server参数将其设置成默认服务器,用于匹配客户端的host请求

    location [=|~|~*|^~] /URI {……} 设定主机名,后可跟多个主机名,主机名称还可以使用通配符和正则表达式(要以~开头)

注:其匹配次序为:

 

~、~* 允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,location可以嵌套

其中=表示精确匹配

    ^~都表示正则表达式模式匹配,只是前者在匹配时区分字符大小写

    root表示作URI左半部分匹配,匹配时不检查正则表达式

注:其匹配次序:

处于同一优先级的URI,排在前面的先被匹配

设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径;如:

                        location /p_w_picpaths/ {

                                    root "/web/imgs/";

alias }

    定义路径别名,

                         location /p_w_picpaths/ {

        root "/web/imgs/";

index }

注:root表示路径为对应location的“ /” URL;alias表示路径映射,即location中的URL是相对于alias后所设定的路径而言

error_page STATUS …… URL设定默认的主页面

error_page STATUS=NEW_STATUS URL 根据http状态码重定向至错误页面

                 以指定的状态码响应客户端

如:                 server {

                        listen       80;

                        server_name  www.stu24.com;

        location / {

                             root   html;

                                            index  index.html index.htm;

                        }

                        error_page   500 502 503 504  /50x.html;

                            location = /50x.html {

                            root   html;

                }

    B、网络连接相关的配置}

 keepalive_timeout TIMEOUT

   keepalive_requests NUM  长连接的超时时长,默认为75s

     keepalive_disable [msie6|safari|none]在一次长连接上允许承载最大资源请求数

      tcp_nodelay on|off 在某些浏览器上禁用保持连接

 client_header_timeout TIMEOUT 是否对长连接使用tcp_nodelay选项,开启之后能有效的提高数据的实时响应性。

    client_body_timeout TIMEOUT 读取http Request报文首部的超时时长

    send_timeout TIMEOUT 读取http Request报文body部分的超时时长

    C、对客户端请求进行限制的相关配置读取http Response报文的超时时长

    

    limit_except METHOD {...} 通过limit_except后面指定的方法名来限制用户请求,如:

limit_except GET {

allow 172.16.0.0/16;

deny all;

}

client_body_max_size SIZE

    limit_rate SPEED 限制请求报文中body部分的上限,通过检测请求报文首部中的"Content_Length"来判定,例如,用户试图上传一个10GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值,就直接发送413 ("Request Entity Too Large")响应给客户端

    D、对内存或磁盘资源进行分配 限制客户端每秒种传输的字节数,默认为0,表示无限制;

        client_body_in_file_only on|clean|off

client_body_in_single_buffer on|off 请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off(默认)不允许暂存; 

     请求报文的body部分是否可暂存于内存buffer中。当然,如果HTTP包体的大小超过了下面client_body_buffer_size设置的值,包体还是会写入到磁盘文件中client_body_buffer_size size

    client_body_temp_path DIR [level1 [level2 [level3 [level4]]]] 设定内存buffer的大小

    client_header_buffer_size SIZE 请求报文的body部分的临时存放目录,在接收HTTP包体时,如果包体的大小大于client_body_buffer_size,则会以一个递增的整数命名并存放到client_body_temp_path指定的目录中。后面跟着的level1、level2、level3,是为了防止一个目录下的文件数量太多,从而导致性能下降,因此使用了level参数,这样可以按照临时文件名最多再加三层目录。例如:client_body_temp_path /var/tmp/nginx/client  1 2

    E、MIME类型相关的配置 存储超大HTTP头部的内存buffer大小

        types {……}

定义MIME types至文件的扩展名;例如:

types {

text/html .html;

p_w_picpath/jpeg  .jpg;

default_type MIME-TYPE }

    F、文件 *** 作优化相关的配置当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME-TYPE作为HTTP header中的Content-Type

        sendfile on|off

aio on|off 是否启用sendfile系统调用来发送文件,设为on,表示减少内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。

    directio size|off  是否启用异步I/O,与sendfile功能互斥

        open_file_cache max=N[inactive=time]|off是否使用O_DIRECT选项去请求读取文件,与sendfile功能互斥;

是否打开文件缓存

nginx可以缓存以下三种信息:

(1) 文件句柄、文件大小和最近一次修改时间;

(2) 打开目录的目录结构;

open_file_cache_errors on|off(3) 没有找到的或者没有权限 *** 作的文件的相关信息;

max=N表示可缓存的最大条目上限;一旦到达上限,则会使用LRU从缓存中删除最近最少使用的条目;

inactive=time: 在inactive指定的时长内没有被访问过的缓存条目就会淘汰;

如:open_file_cache max=1000 inactive=20s;

        open_file_cache_min_uses INTERVAL 是否缓存打开文件错误的信息

    Nginx优化相关配置检查一次缓存中缓存条目有效性的时间间隔;默认60s;

    讲了一大堆,其实我们重点关注以下几项就足以应付生产环境中的需求了:

server{}, location{}, listen, server_name, root, alias, keepalive_timeout,keepalive_requests, error_page

    A、基于IP的访问控制

allow, deny

    在http, server, location中使用B、基于用户的basic认证配置指令定义,匹配法则类似于iptables,自上而下依次匹配,如:

                        location / {

                            deny  192.168.1.1;

                            allow 192.168.1.0/24;

                            allow 10.1.1.0/16;

                            deny  all;

                        }

    auth_basic "AUTH_NAME"

    auth_basic_user_file /PATH/TO/PASSWD_FILE

             ,建议使用htpasswd命令创建用户账号文件;

例如:

                        location /wp-login.php {

                            auth_basic 'Welcome WordPress';

                            auth_basic_user_file  /home/mypwd/pass;

                        }C、基于gzip实现响应报文压缩 

    gzip on|off

    gzip_http_version 1.1|1.0  是否开启gzip压缩,开启之后节省网络带宽,却增加了服务器CPU的开销

    gzip_min_length LENGTH   设定启用gzip压缩时客户端请求使用的http协议版本号

    gzip_buffers NUM SIZE设定最小压缩的页面,注:若页面过小,可能导致页面越压越大,单位为B,如:gzip_min_length 1024

    gzip_comp_level 3 设定存储压缩后的响应报文的缓存区数量及大小,默认为一个页面的大小,具体大小依赖于系统平台,不是4K就是8K(getconf PAGE_SIZE 获取系统内存页面大小),例如:gzip_buffers 4 8k

    gzip_types MIME_TYPE 设定gzip的压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,一般设置为3就可以了

    gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any]设定gzip压缩的MIME类型

    

                gzip on;
                gzip_comp_level 3;
                gzip_buffers 4 8k;
                gzip_http_version 1.1;
                gzip_disable "MSIE [1-6]";
                gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php p_w_picpath/jpeg p_w_picpath/gif p_w_picpath/png;
根据某些请求和应答来决定是否在对代理请求的应答启用压缩,代理请求取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数:

                            off 为所有代理请求禁用压缩。

                            expired 当“Expires”头禁用缓存时启用压缩。

                            no-cache 当“Cache-Control”头设置为no-cache时启用压缩。

                            no-store  当“Cache-Control”头设置为no-store时启用压缩。

                            private  当“Cache-Control”头设置为private时启用压缩。

                            no_last_modified  当“Last-Modified”没有定义时启用压缩。

                            no_etag  没有“ETag”头时启用压缩。

                            auth 当有一个“Authorization”头时启用压缩。

                            any  为所有请求启用压缩。

                            gzip_disable 设定在某些浏览器上不启用gzip压缩

gzip使用实例:

D、定制响应首部

    add_header key value [always]

    expires TIME,如:add_header  Content-Type 'text/html; charset=utf-8';

    

                location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
                           expires 30d;
                 }
,设定缓存时间 如:

E、定制访问日志

    log_format NAME LOG_FORMAT 

    access_log 设置日志的记录格式,

    

log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /var/log/access.log   access
指定日志文件的存放路径、格式和缓存大小,也可以使用off关闭日志功能,如:

F、定义合法引用,防盗链

        $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;

        $remote_user  用来记录客户端用户名称;

        $time_local    用来记录访问时间与时区;

        $request   用来记录请求的url与http协议;

        $status   用来记录请求状态;成功是200,

        $body_bytes_sent  记录发送给客户端文件主体内容大小;

        $http_referer  用来记录从那个页面链接访问过来的;

        $http_user_agent  记录客户端浏览器的相关信息;

    valid_referers none | blocked | server_names | string ...

    

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
                    valid_referers none blocked www.stu24.com stu24.com;
                    if ($invalid_referer){
                               return 403;
                    }
}
如:

    G、定义路径重写,与正则表达式结合if判断使用

rewrite regex replacement [flag]

    if (condition) {

flag标记有四种格式:

            last 相当于Apache中的L

            break 中止Rewirte,不在继续匹配

            redirect  返回临时重定向的HTTP状态302,相当于Apache中的R

            permanent 返回永久重定向的HTTP状态301,相当于Apache中的R=301

    

    }...

        return STATUS URL 

条件conditon可以是如下任何内容:

            一个变量名;false如果这个变量是空字符串或者以0开始的字符串;

            使用= ,!= 比较的一个变量和字符串

            使用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围

            使用-f ,!-f 检查一个文件是否存在

            使用-d, !-d 检查一个目录是否存在

            使用-e ,!-e 检查一个文件、目录、符号链接是否存在

            使用-x , !-x 检查一个文件是否可执行

    set VARIABLE VALUE 结束规则时执行并返回状态码给客户端

    if ($host != 'www.stu24.com' ) {
        rewrite ^/(.*)$ http://www.stu24.com/ permanent;
    }
定义一个变量,并给变量赋值

例如:将访问的URL是 stu24.com重定向为www.stu24.com


附录:nginx有以下内置变量

    $args, 请求中的参数;

    $content_length, HTTP请求信息里的"Content-Length";

    $content_type, 请求信息里的"Content-Type";

    $document_root, 针对当前请求的根路径设置值;

    $document_uri, 与$uri相同;

    $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

    $limit_rate, 对连接速率的限制;

    $request_method, 请求的方法,比如"GET"、"POST"等;

    $remote_addr, 客户端地址;

    $remote_port, 客户端端口号;

    $remote_user, 客户端用户名,认证用;

    $request_filename, 当前请求的文件路径名

    $request_uri, 请求的URI,带查询字符串;

    $query_string, 与$args相同;

    $scheme, 所用的协议,比如http或者是https,比如:

    rewrite ^(.+)$  $scheme://example.com$1  redirect;

    $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

    $server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);

    $server_name, 请求到达的服务器名;

    $server_port, 请求到达的服务器端口号;

    $uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

这些变量可以用在rewrite规则里,也可以打印日志的时候用

部分内容引用《深入理解nginx:模块开发与架构解析》

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/783906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存