一、nginx安装及配置文件(rpm包安装要配置epel源才可以)

1、编译安装

#yum -y groupinstall "Development Tools" "Server Paltfrom Development"   安装gcc zlib 等依赖包

#yum -y install pcre-devel  安装重写引擎,组包不会安装

#groupadd -r nginx

#useradd -r -g nginx nginx

#tar xf nginx-1.4.7.tar.gz
#cd nginx-1.4.7
#./configure --help | less   #查看要安装的路径
# ./configure \

  --user=nginx \
  --group=nginx \

  --prefix=/usr/local/nginx \

  --with-http_ssl_module \

  --with-http_stub_status_module \

  --sbin-path=/usr/sbin/nginx \

  --conf-path=/etc/nginx/nginx.conf \

  --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_flv_module \
  --with-http_gzip_static_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/fcgi/ \       转发fastcgi临时文件目录
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre  (要记录安装步骤可以管道 | tee /tmp/nginx.out )

#make &&make install

#which nginx                #查看nginx的安装路径
/usr/sbin/nginx

#/usr/sbin/nginx -h   查看配置参数

#/usr/sbin/nginx -t         #检查语法错误

注,可能会报错,没有nginx用户或/var/tmp下没有nginx目录,创建即可!

#useradd -r nginx
#/usr/sbin/nginx -t
#mkdir /var/tmp/nginx
#/usr/sbin/nginx -t


#/usr/sbin/naginx   #启动nginx#ss -tnl
#ps -aux | grep nginx # 查看nginx进程,master以root身份运行,worker以nginx身份运行

root-----------master

nginx---------worker

root-----------nginx


2、设置开机自启动
#killall nginx  杀掉nginx进程
#vim /etc/rc.d/init.d/nginx    #为nginx提供SysV init脚本
脚本见:http://liwenjia.blog.51cto.com/2656598/1953623


#chmod +x /etc/rc.d/init.d/nginx    #为此脚本赋予执行权限
#chkconfig --add nginx   #添加开机启动
#chkconfig nginx on
# service nginx start



二、ngxin 配置文件及优化详解


1、nginx的配置文件说明

user username  指定运行worker进程的用户和组

pid  /path/to/pidfile_name  指定nginx的pid文件

worker_rlimit_nofile  # ;指定一个worker进程所打开的最大文件数

worker_rlimit_sigpengding  # ;  设定每个用户能够发往worker进程的信号的数量


2、优化性能相关的配置

(1)、worker_processes # ;  worker进程的个数;通常其数字应该是CPU的物理核心数减1

(2)、work_cpu_affinity cpumask ……  cup掩码

例如  work_processes 6;

        work_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;

        表示若系统有100个进程,这6个nginx进程运行(绑定)在这6颗CPU上。

(3)、ssl_engine device;  SSL硬件加速,在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;比如nginx能支持http10000个请求,如果是HTTPS能支持2000就不错了,所有这里用配置来着SSL加速请求。

(4)、time_resolution t;  每次内核时间调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution 用于定义每隔多久才会由gettimeofday()更新一次缓存时钟:x86_64系统上,gettimeofday()代价已经很小了,可以忽略此项,适合老服务器。

(5)、worker_priority  nice ;  worker 进程的优先级 ;-20,20之间的值;

当然还有网络方面的优化参数,后面再学习。


3、事件相关的配置

(1)、accept_mutex [on|off]

是否打开nginx的负载均衡锁,此锁能够让多个worker进程轮流的、序列化的与新的客户端建立连接,而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不再将请求调度此worker;默认打开

(2)、lock_file /path/to/lock_file;   lock文件

(3)、accept_mutex_delay #ms; 

accept锁模式中,一个worker进程为取得accept锁的等待时长;如果某worker进程在某次试图取得锁时失败了,至少要等待#ms才能再一次请求锁;默认500ms

(4)、multi_accept on |off     是否允许一次性响应多个用户请求;默认off

(5)、use [ epoll | rtsig | select | poll] 定义使用的事件模型,建议让nginx自动选择;

(6)、worker_connections #;  每个worker 能够并发响应最大请求数;此参数值应该和worker_rlimit_nofile 相等或比worker_rlimit_nofile小点,如果是nginx代理服务器,worker_rlimit_nofile应该是worker_connectionns的2倍。


4、用于调试、定位问题:只调试nginx时使用

(1)、daemon [on |off ]; 是否让nginx运行后台,默认on ,调试时可以设置为off,使得所有信息去接输出控制台

(2)、master_process  on | off

是否以master/worker模式运行nginx,默认为on;调试时可设置为off 以方便追踪;

(3)、error_log /path/to/error_log  level;

错误日志文件及其级别:调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能,默认为error级别。


5、nginx 的http功能

    必须使用虚拟主机来配置站点:每个虚拟主机使用一个server{ }段配置;

        

    非虚拟主机的配置或公共配置,需要定义在server之外,http之内;

        http{

             directive value;

            server{

            }

        }

(1)、server{} 定义一个虚拟主机,nginx支持使用基于主机名或ip的虚拟主机

(2)、listen  address [:port]

    default_server:定义此server为http中默认的server,如果所有的server中没有任何一个listen使用此参数,那么第一个server即为默认server;

    rcvbuf=SIZE  接受缓冲大小

    sndbuf=SIZE  发送缓冲大小

    ssl :https server

(3)、server_name [……]

    server_name 可以跟多个主机名,名称中可以使用通配符和正则表达式(通常以~开头)

    当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较,比较方式:

    1、先做精确匹配:www.mageedu.com

    2、左侧通配符匹配:*.mageeud.com

    3、右侧通配符匹配:www.abc.com,www.*

    4、正则表达式匹配:~^.*\.mageedu\.com$

(4)、server_name_bash_bucket_size  32|64|128;

    为了实现快速主机查找,nginx使用hash表来保存主机名;

 (5)、location [ = | ~ | ~* | ^~ ] uri {...}

    location @name

    功能:允许根据用户请求的URI来匹配指定的location以进行访问配置;匹配到时,将被location块中的配置所处理:比如 http://www.magedu.com/p_w_picpaths/logo.gif

    =  : 精确匹配

    ~  :正则表达式模式匹配,匹配时区分字符大小写

    ~* :正则表达式模式匹配,匹配时忽略字符大小写

    ^~ : URI前半部分匹配,不检查正则表达式

    http://www.magedu.com/index.html

    http://www.magedu.com/

    http://www.magedu.com/documents/index.html

    http://www.magedu.com/p_w_picpaths/index.html

    http://www.magedu.com/p_w_picpaths/a.jpg


    匹配优先级:

        字符字面量最精确匹配,正则表达式检索(由第一个匹配到所处理)


 6、文件路径定义

    1、root path  设置web资源路径,用于指定请求的根文档目录

        location / {

            root /www/htdocs;

        }

        location ^~  /p_w_picpaths/  {

                        root  /web;

                }

     访问http://www.magedu.com/p_w_picpaths/b.html  ,如果匹配第一个location ,b.html在/www/htdocs/p_w_picpaths/        下 ,如果匹配第二个location,b.html则放在/web/p_w_picpaths/ 下,这就是root的作用。




三、实战nginx的配置和使用

    1、虚拟主机

        server {

            listen 80;

            server_name www.b.org;

            root /www/html;

        }

    2、访问控制

        基于ip地址做控制

        deny 192.168.1.100

        allow 192.168.0.0/24

    3、用户认证实例

        基于目录做控制要放在location中,如

        location /admin/ {

                root /www/b.org;

                auth_basic "admin_area";

                auth_basic_user_file /etc/naginx/.htpasswd;

        }

    4、建立下载站点autoindex 模块

        location /download/ {

                root /www/b.org/;

                autoindex on;

        }

    5、referer 模块用于防盗链

       (1)定义合规的引用

        valid_referers   none | blocked |server_names |string……

       (2)拒绝不合规的引用

                if ($invalid_referer) {

                    rewrite

                }

    6、URL rewrite 地址重定向

        如,域名跳转,URL跳转,地址重定向

        语法:rewrite  regex  replacement  [flag];  

             # rewrite  正则    重写       标志位

        如:location /{

                root /www/b.org;

                rewrite  ^/p_w_picpaths/(.*) $  /imgs/$1;

            }     

说明:如果访问以p_w_picpaths目录开头的任意文件(.*),都返回imgs下的任意文件,

此$1=(.*)如:http://www.b.org/p_w_picpaths/a.jpg---->http://www.b.org/imgs/a.jpg


            标准位:标志位防止请求的链接再次循环匹配条件,

            last:一旦被当前规则匹配并重写后,立即停止检查后续的其他rewrite规则,而由通过重写后的规则重新发起请求。

            break:一旦被当前规则匹配并重写后,立即停止后续的其他rewrite规则,而后继续由nginx进行后续的操作。

            redirect:返回302临时重定向:

            permanent:返回301永久重定向:

注意:nginx最多循环10次,超出之后会返回500错误;

一般rewrite写在location中时,都配合break使用,防止死循环,或者写入if上下文中。


例:location  /download/ {

            root /www/b.org/;

            rewrite ^/download/(.*\.( jpg | gif | jpeg | png ))$  /p_w_picpaths/$1 last ;

            说明:/download/下的任意已jpg、gif、jpeg、pgn结尾的文件,重定向到p_w_picpaths下,在p_w_picpaths下创建一个1.jpg 的图片,访问/download/时能看到此图片,说明成功了。


        rewrite_log  on | off   #是否把重写过程记录错误日志中,日志级别为notice时生效,默认off。

        return code:用于结束rewrite规则,并且为客户端返回状态码有204 400 402 500-504 等。

        

    7、if (condition)