What is Nginx?
Nginx与Apach类似,是一款高性能的HTTP和反向代理服务器软件,由俄罗斯程序员 lgor Sysoev开发,可以运行在 UNIX、GNULINUX、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"方式进行安装;
1
2
3
4
5
6
7
| 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 方法:
1
| ps -ef |grep "nginx:master process" |grep -v "grep" | awk -F' ' '{print $2}# 获取Nginx所有进程的PID;
|
1
| cat /usr/local/logs/nginx.pid # 如果编译安装时没有指定Pid参数,nginx程序所在目录/logs/nginx.pid
|
例:
1
| kill -HUP `cat /usr/local/nginx/logs/nginx.pid` # 此处使用了命令引用,先获取pid,在向kill 向 nginx进程传递 HUP 信号;
|
基于虚拟主机配置Nginx:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 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;
}
}
|
准备主页文件:
1
2
3
| mkdir /www /qqq
echo "Welcome to nginx. > /www/index.html
echo "Welcome to domian. > /qqq/index.html
|
启动Nginx:
1
| /usr/local/nginx/sbin/nginx
|
# 此时即定义了两个虚拟主机,关于配置文件含义在另一篇博客中有详解,此处就不在做介绍;
测试方法:
做一台DNS服务器,建立一条两条A记录,分别指向这两台虚拟主机,或直接修改客户端的hosts文件,将这两个域名与IP的对应关系写在其中即可;
OK,两个虚拟主机都测试成功;
基于端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 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;
}
}
|
此时在用浏览器加上端口访问即可;
基于Openssl 服务实现 https:
环境,CA及与Nginx在同一台机器上;
1、为CA生成自签证书:
1
2
| cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [iyunv@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
[iyunv@bogon CA]# touch {index.txt,serial}
[iyunv@bogon CA]# echo 01 > serial
|
2、为Nginx生成私钥,并申请证书:
1
2
| cd /etc/nginx/
(umask 077;openssl genrsa -out nginx.key 2048)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| [iyunv@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、签署证书:
1
| [iyunv@bogon nginx]# openssl ca -in nginx.csr -out nginx.crt -days 365
|
4、更改Nginx配置文件,支持https:(默认Nginx的SSL配置文件是注释的,启用起来即可)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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
|
5、导出CA证书到客户机:
将刚刚为CA自签的证书cacert.pem 倒出到客户机,并重命名为 cacert.crt,双击倒入到受信任的根证书颁发机构:
6、验证https工作是否正常:
OK,Nginx服务启用https功能,到此处即完成;
|