首页 > 代码库 > Nginx

Nginx

Nginx



首先了解Nginx的功能和特性


Nginx的特性:

        模块化设计、较好扩展性

        高可靠性

            master-->worker

        低内存消耗

            10000个keep-alive连接在Nginx仅消耗2.5MB

        支持热部署

            不停机而更新配置文件、更换日志文件、更新服务器程序版本

        

    基本功能:

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

        http, smtp, pop3协议的反向代理服务器,缓存、负载均衡;

        支持FastCGI (fpm)

        模块化,非DSO机制,过滤器zip,SSI及图像大小调整;

        支持SSL

        

    扩展功能:

        基于名称和IP的虚拟主机;

        支持keepalive

        支持平滑升级

        定制访问日志 ,支持使用日志缓冲区提高日志存储性能

        支持url rewrite

        支持路径别名

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

        支持速率限制,支持并发数限制

        

    Nginx的基本架构:

        一个master进程,生成一个或多个worker

        事件驱动: epoll, kqueue, /dev/poll (event ports)

            消息通知:select, poll, rt signals

        支持sendfile, sendfile64

        支持AIO

        支持mmap

        

    nginx: 非阻塞、事件驱动、一个master生成一个或多个worker, 每个worker响应n个请求;

    

    模块类型:

        核心模块

        Standard HTTP modules

        Optional HTTP modules

        Mail modules

         3rd party modules

 

如何安装及使用nginx        

【1】

首先进行nginx安装:


从官网下载好源码包并解压到/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 根据自己的需求添加模块。


编译安装命令

rpm及源码安装:

        # ./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 --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi

        # make && make install

        

        Tmalloc, gperftools

        

注:若出现编译错误,大多数是缺少对应模块功能的开发包,比如--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"] && exit0nginx="/usr/local/nginx/sbin/nginx"prog=$(basename$nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs() {# make required directoriesuser=`nginx -V 2>&1 | grep"configure arguments:"| sed‘s/[^*]*--user=\([^ ]*\).*/\1/g‘-`options=`$nginx -V 2>&1 | grep‘configure arguments:‘`foropt in$options; doif[ `echo$opt | grep‘.*-temp-path‘` ]; thenvalue=http://www.mamicode.com/`echo$opt | cut-d"="-f 2`if[ ! -d "$value"]; then# echo "creating" $valuemkdir-p $value && chown-R $user $valuefifidone}start() {[ -x $nginx ] || exit5[ -f $NGINX_CONF_FILE ] || exit6make_dirsecho-n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq0 ] && touch$lockfilereturn$retval}stop() {echo-n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq0 ] && rm-f $lockfilereturn$retval}restart() {configtest || return$?stopsleep1start}reload() {configtest || return$?echo-n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo}force_reload() {restart}configtest() {$nginx -t -c $NGINX_CONF_FILE}rh_status() {status $prog}rh_status_q() {rh_status >/dev/null2>&1}case"$1"instart)rh_status_q && exit0$1;;stop)rh_status_q || exit0$1;;restart|configtest)$1;;reload)rh_status_q || exit7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit0;;*)echo$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit2esac将服务脚本的权限设置为可执行:chmod +x /etc/init.d/nginx


将服务加入服务列表中,并设置为开机自启动:chkconfig --add nginx && chkconfig nginx on


测试启动nginx:service nginx start



【2】


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

1234567891011121314151617181920http {upstreamserver {....}server {#定义虚拟主机listen IP:PORT;server_name SER_NAMElocation /URL{if...{...}root "/path/to/somewhere";...}}server {……}}注:与http配置相关的指令必须放在http、server、location、upstream、if块中


来介绍下http配置段的常用参数:

1、虚拟主机的相关配置


使用server {……}用于定义一个虚拟主机

listen IP_ADDR [:port] [default_server]

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


server_name Serv_NAME

      设定主机名,后可跟多个主机名,主机名称还可以使用通配符和正则表达式(要以~开头)


注意:其匹配次序为:

location [=|~|~*|^~] /URI {……}允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,location可以嵌套

其中=表示精确匹配

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

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



listen

    监听的端口

    完整格式 :listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

                

    listen address[:port] [default_server] ssl 

                

    backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;

    rcvbuf=size:设定监听句柄的SO_RCVBUF参数;

                

    例如:

        listen 172.16.100.8:8080

                    


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

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

    location /images/ {

    root "/web/imgs/";

    }

alias定义路径别名,

    location /images/ {

    root "/web/imgs/";

    }

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


index设定默认的主页面

    index index.html; 


error_page code [...] [=code] URI | @name

    根据http状态码重定向错误页面

    error_page  404   /404.html

                

    =[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;

                

try_files

    try_files path1[,path2,...] URI 

                

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

    error_page STATUS=NEW_STATUS URL以指定的状态码响应客户端

如:

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;

}

}






2、网络连接相关的配置


   1、keepalive_timeout time;

                保持连接的超时时长,默认为75s;

                

   2、keepalive_requests #;

                在一次保持连接上允许承载最大资源请求数;

                

   3、keepalive_disable [msie6|safari|none]

                为指定类型的浏览器禁用长连接;

                

   4、tcp_nodelay on|off

                对长连接是否使用TCP_NODELAY选项;

                

   5、client_header_timeout time;

                读取http请求报文首部的超时时长;

                

   6、client_body_timeout time;

                读取http请求报文body部分的超时时长;

                

   7、send_timeout time;

                发送响应报文的超时时长;

3、对客户端请求进行限制的相关配置


    1、limit_except METHOD {...}

        指定对范围之外的其它方法的访问控制;

                

        limit_except GET {

            allow 172.16.0.0/16;

            deny all;

        }

                

        2、client_body_max_size SIZE;

            限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;

                

        3、limit_rate speed; 

            限制客户端每秒种传输的字节数,默认为0,表示无限制;

                

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

limit_rate SPEED限制客户端每秒种传输的字节数,默认为0,表示无限制;


4、对内存或磁盘资源进行分配


    1、client_body_in_file_only on|clean|off;

        请求报文的body部分是否可暂存于磁盘:

            on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;


   2、client_body_in_single_buffer on|off

        请求报文的body部分是否可暂存于内存内核的buffer中

            默认为off


   3、client_body_buffer_size size

            允许之后要多大的空间


    4、client_body_temp_path DIR [lv1 [lv2 [lv3 [lv4]]]]

            存在什么位置   几级子目录

                例如:client_body_temp_path /var/tmp/nginx/client 1 2


    5、client_header_buffer_size size

            正常情况下接受用户请求报文的header预留的内存的空间大小


5、MIME类型相关的配置


   1、types {……}定义MIME types至文件的扩展名;


   例如:

        types {

        text/html .html;

        image/jpeg  .jpg;

        }

   2、default_type MIME-TYPE当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME-TYPE作为HTTP header中的Content-Type


6、文件操作优化相关的配置:


    1、sendfile on|off


    2、aio on|off

         是否启用异步IO


    3、directio size|off

         是否使用O_DIRECT选项去请求读取文件;缓冲区大小是size;与sendfile功能互斥


    4、open_file_cache max=N[inactive=time]|off

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

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

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

             (3)没有找到的或者没有权限操作的文件的相关信息


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


         inactive=time:在inactive指定的时长内没有被访问的缓存条目就会淘汰,默认为60S


    5、open_file_cache-errors on|off

          是否缓存文件缓存中缓存打开文件时出现找不到路径,没有权限等的错误信息;


    6、open_file_cache_min_uses time:

          每隔多久检查一次缓存中缓存条目的有效性 ,默认为60S


   重点关注:server{},location{},listen,server_name,root,alias,keepalive_timeout,keepalive_requests,error_page


如:

open_file_cache max=1000 inactive=20s;

open_file_cache_errors on|off是否缓存打开文件错误的信息

open_file_cache_min_uses INTERVAL检查一次缓存中缓存条目有效性的时间间隔;默认60s;

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

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



【3】

Nginx常用配置(配置文件/etc/nginx/nginx.conf)


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

<section> {

<directive> <parameters>;

}

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

main配置段的常用参数


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


user USERNAME GROUP指定运行worker进程的用户和组,如果在编译中没有指定,需将注释去掉,以nobody身份运行worker进程

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

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

worker_rlimit_sigpending NUM  指定每个用户能够发往worker进程的信号的数量


2、优化性能的相关配置


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

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

worker_processes     4;

worker_cpu_affinity 0001 0010 0100 1000;

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

worker_priority nice_NUM设定worker进程运行的优先级(按nice值设置),默认为0;如:worker_priority -20


3、事件event相关的配置(以下配置需写在event {……}中)


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

maxclients = worker_processes * worker_connections

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

maxclients = worker_processes * worker_connections/4

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

lock_file /PATH/TO/LOCK_FILE负载均衡锁的路径

accept_mutex_delay INTERVAL等待负载均衡锁的时间间隔

use epoll|rgsig|select|poll设定worker进程使用的事件模型IO,建议让Nginx自动选择


4、用于调试、定位问题的相关配置


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

master_process on|off是否以master/worker模型来运行nginx

error_log /PATH/TO/error_log debug|info|notice|warn|error|crit|alert|emerg设定错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;要禁用错误日志,不能使用“error_log off;”,而要使用类似如下选项:                                             error_log /dev/null crit






Nginx优化相关配置:


1、基于IP的访问控制


在http, server, location中使用allow, deny指令定义,匹配法则类似于iptables,自上而下依次匹配,如:

location / {

deny  192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

deny  all;

}


2、基于用户的basic认证配置


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;

}


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


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

    gzip_http_version 1.1|1.0  设定启用gzip压缩时客户端请求使用的http协议版本号

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

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

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

    gzip_types MIME_TYPE设定gzip压缩的MIME类型

    gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] 根据某些请求和应答来决定是否在对代理请求的应答启用压缩,代理请求取决于请求头中的“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使用实例:


1

2

3

4

5

6

                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 image/jpeg image/gif image/png;


4、定制响应首部


    add_header key value [always],如:add_header  Content-Type ‘text/html; charset=utf-8‘;

    expires TIME,设定缓存时间 


5、定制访问日志


    log_format NAME LOG_FORMAT 设置日志的记录格式,

    access_log 指定日志文件的存放路径、格式和缓存大小,也可以使用off关闭日志功能,

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

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

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

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

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

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

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

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


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


    valid_referers none | blocked | server_names | string ...


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


    rewrite regex replacement [flag]

flag标记有四种格式:

            last 相当于Apache中的L

            break 中止Rewirte,不在继续匹配

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

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

    if (condition) {

    ...

    }

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

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

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

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

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

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

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

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

    return STATUS URL 结束规则时执行并返回状态码给客户端

    set VARIABLE VALUE 定义一个变量,并给变量赋值



最后总结:nginx

    主配置

        http

            core:server{},location{},

            access

            basic

            gzip

            ssl

            rewrite

            log

            referer

            stub_status

            headers


Nginx