What is Nginx?


    Nginx与Apach类似,是一款高性能的HTTP和反向代理服务器软件,由俄罗斯程序员 lgor Sysoev开发,可以运行在 UNIX、GNU\LINUX、BSD、Mac OS X、Solaris及Microsoft Windwos等操作系统中;




What 使用 Nginx?


    Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机URL重写、压缩传输、SSL 加密传输等,它们之间最大差别是Apache所有模块都支持动、静态编译,而Nginx模块都是静态编译的,同时 Apache对Fcgi支持不太好,而Nginx对Fcgi支持非常好,在处理连接方式上,Nginx支持epoll,而Apache却不支持,在空间使用上,Nginx安装包仅有几百K,与Nginx比起来,Apache显得非常庞大;




Nginx模块与工作原理:


    Nginx由内核与模块组成,内核的设计非常微小简洁,完成的工作非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block (location 是Nginx配置中的一个指令,用于URL匹配),location中所配置的每个指令将会启动不同的模块完成相应的工作;


    Nginx模块从结构上分为核心模块、基础模块和第三方模块,HTTP模块、EVENT模块和MAIL模块等属于核心模块,HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite属于基础模块,其它任何用户根据自己需要开发的模块都属于第三方模块,Nginx有着众多的模块,所以变得特别强大;


Nginx模块从功能上分为三类:


    Handlers(处理器模块)此类模块直接处理请求,并进行输出内容和修改headers信息等操作,Handlers处理模块一般只能有一个;


    Filter(过滤器模块)此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出

    

    Proxies(代理类模块)此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能;


Nginx分为单工作进程和多工作进程两种模式:

        单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;

        多工作进程模式下,每个工作进程包含多个线程,Nginx默认为单工作进程模式;


    Nginx的模块直接被编译进Nginx,因此属于静态编译方式,启动Nginx后,Nginx的模块被自动加载,不像Apache,首先将模块编译为一个so文件,然后在配置文件中指定是否加载;




Nginx官方站点:http://nginx.org/

        Nginx分为三个版本:稳定版、开发版与历史稳定版;

            次版本号为偶数即为稳定版,奇数为开发版,稳定版都是经过了生产环境的严格测试,因此建议生产环境中,选择次版本号为偶数的稳定版;

           

        # 目前最新版本为 Nginx 1.7.9;

        # 此处以1.6.2为示例,进行编译:


Nginx 6.2官方下载链接:

    http://nginx.org/download/nginx-1.6.2.tar.gz



    Nginx安装过程非常简单,默认情况下,编译安装Nginx包含了大部分可用模块,可通过"./configure --help" 选项查看 Nginx编译时可以接受的选项,例如不需要 http_ssi模块,可通过 "--without-http_ssi_module" 方式关闭,同理如果需要  "http_perl"模块,可通过  "--with-http_perl_module"方式进行安装;


tar  zvf  nginx-1.6.2.tar.gz
cd  nginx-1.6.2
./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


编译三部曲:

1、configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:

2、make用来编译,它从Makefile中读取指令,然后编译。

3、make install用来安装编译后的程序,它从Makefile中读取指令,并安装到指定的位置。


--prefix=path     # 指定Nginx 安装位置,默认使用 /usr/local/nginx。

--sbin-path=path  # 设置 nginx可执行文件路径,默认为 prefix/sbin/nginx。

--conf-path=path  # 指定Nginx 配置文件存放路径,nginx允许使用不同的配置文件启动,通过 nginx -c选项,默认配置文件位置为  prefix/conf/nginx.conf;

--pid-path=path/name.pid   # 设置 nginx.pid文件位置,安装完成后可在nginx.conf配置文件中更改位置,默认位置为  prefix/logs/nginx.pid;

--error-log-path=path/name.log # 设置错误日志位置及名称,安装完成后可在nginx.conf配置文件中更改位置,默认位置为  prefix/logs/error.log;

--http-log-path=path/name.log  # http访问日志路径,安装后可在nginx.conf配置文件中更改位置,默认位置为 prefix/logs/access.log;

--user=name                   # 设置 nginx工作进程的用户,安装完成后可在Nginx.conf配置文件中用user指令更改,默认用户为 nobody;

--group=name                 # 设置nginx工作进程的用户组,安装后可在Nginx.conf配置文件中用user 指令更改;

--lock-path=path/name.lock   # 指定锁文件位置

--with-http_ssl_module      # 支持https协议,默认不会编被编译,编译时需要安装 openssl-devel

--with-http_stub_status_module  # http状态模块,默认不会被编译,可通过网页输出http状态

--with-http_gzip_static_module  # 启用 gzip 模块用于网页在传输时压缩

--with-http_flv_module          # 启用 flv 流媒体模块

--with-http_mp4_module          # 启用 httpd_mp4  mp4格式流媒体模块

--http-client-body-temp-path=   # body 的临时存放路径

--http-proxy-temp-path=         # proxy 临时存放路径

--http-fastcgi-temp-path=       # fsstcgi 临时存放路径




Nginx命令:    

    /usr/local/sbin/nginx   启动Nginx服务

    /usr/local/sbin/nginx -t  测试配置文件语法

    /usr/local/sbin/gginx -t -c /path/some  Nginx支持使用不同的配置文件启动 -c 指定不同的配置文件

    /usr/local/sbin/nginx -v  查看 Nginx 版本

    /usr/local/sbin/nginx -V  显示Nginx版本与编译时都用了哪些额外选项


Nginx对进程的控制能力非常强大,可通过信号指令控制进程:

    常用的信号 :

        HUP:表示重新加载配置,也就是关闭原有进程,并开启新的进程;此操作不会中断用户的访问请求,因此可以用此信号平滑重启Nginx;

        USR1:用于Nginx日志切换,重新打开一个日志文件,例如每天要生成一个新日志文件时,可用这个信号来控制;

        USR2:用于平滑升级可执行程序

        QUIT:处理完所有请求以后,关闭该进程


获取Nginx PID 方法:

    

ps -ef |grep "nginx:master process" |grep -v "grep" | awk -F' ' '{print $2} # 获取Nginx所有进程的PID;

    

cat  /usr/local/logs/nginx.pid   # 如果编译安装时没有指定Pid参数,默认在nginx程序所在目录/logs/nginx.pid

    

    例:       

kill  -HUP  `cat /usr/local/nginx/logs/nginx.pid`  # 此处使用了命令引用,先获取pid,在向kill 向 nginx进程传递 HUP 信号;




基于虚拟主机配置Nginx:

   

 vim /etc/nginx/nginx.conf
    
        server {
                listen 172.16.4.33:80;
                server_name www.nginx.com;
                root /www;
        location /www {
                index index.html index.htm;
                }
        }
        
        server {
                listen 172.16.4.33:80;
                server_name www.domain.com;
                root /qqq
        location /qqq {
                index  index.html index.htm;
                }
        }

准备主页文件:

    mkdir /www  /qqq
    echo "Welcome to nginx. >  /www/index.html
    echo "Welcome to domian. > /qqq/index.html


启动Nginx:

    /usr/local/nginx/sbin/nginx

       # 此时即定义了两个虚拟主机,关于配置文件含义在另一篇博客中有详解,此处就不在做介绍;



测试方法:

    做一台DNS服务器,建立一条两条A记录,分别指向这两台虚拟主机,或直接修改客户端的hosts文件,将这两个域名与IP的对应关系写在其中即可;

    wKiom1SgEw3huGESAAG9bm9uOLs444.jpg


wKioL1SgE-CTzhVuAABXICvJA7U695.jpg

wKioL1SgE-Dh8eDDAABh0ZpfcNg703.jpg

 

OK,两个虚拟主机都测试成功;



基于端口:


    

vim /etc/nginx/nginx.conf
    
        server {
                listen 172.16.4.33:888;
                server_name www.nginx.com;
                root /www;
        location /www {
                index index.html index.htm;
                }
        }
        
        server {
                listen 172.16.4.33:999;
                server_name www.nginx.com;
                root /qqq
        location /qqq {
                index  index.html index.htm;
                }
        }

wKiom1SgFFmw18vNAAC1k2vXggo559.jpg

    此时在用浏览器加上端口访问即可;



基于Openssl 服务实现 https:

    环境,CA及与Nginx在同一台机器上; 


1、为CA生成自签证书:

    cd /etc/pki/CA
    (umask 077;openssl genrsa -out private/cakey.pem 2048)
[root@bogon CA]# openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:mail@example.com

[root@bogon CA]# touch {index.txt,serial}
[root@bogon CA]# echo 01 > serial

      

2、为Nginx生成私钥,并申请证书:

  

  cd /etc/nginx/
    (umask 077;openssl genrsa -out nginx.key 2048)
[root@bogon nginx]# openssl req -new -key nginx.key -out nginx.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:nginx.com
Email Address []:mail@nginx.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


3、签署证书:

  [root@bogon nginx]# openssl ca -in nginx.csr -out nginx.crt -days 365


4、更改Nginx配置文件,支持https:(默认Nginx的SSL配置文件是注释的,启用起来即可)

    

server {
        listen       443 ssl;
        server_name  www.nginx.com;
        ssl_certificate      nginx.crt;
        ssl_certificate_key  nginx.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   /www;
            index  index.html index.htm;
        }
    }
killall nginx
/usr/local/nginx/sbin/nginx

wKioL1SgHsXRmWkEAADHkFvIjnA697.jpg


5、导出CA证书到客户机:

    将刚刚为CA自签的证书cacert.pem 倒出到客户机,并重命名为 cacert.crt,双击倒入到受信任的根证书颁发机构:

        wKiom1SgHl2TAtvjAACBsxTf_io968.jpg

    

6、验证https工作是否正常:

    wKioL1SgHzjjTlcjAAF1MvELKu8310.jpg



OK,Nginx服务启用https功能,到此处即完成,后缀还会发布Nginx反向代理,笔者水平有限,如有疏漏不妥之处,还请不吝赐教!