Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪网易腾讯等。

 Nginx服务_中国大陆

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服


1Apache服务器和nginx的优缺点:
我们之前大量使用Apache来作为HTTPServerApache具有很优秀的性能,而且通过模块可以提供各种丰富的功能。
1)首先Apache对客户端的响应是支持并发的 ,运行httpd这个daemon进程之后,它会同时产生多个子进程/线程,每个子进程/线程分别对客户端的请求进行响应;


Apache两种工作模式:prefork模式与worker模式


prefork每个子进程只有一个线程,效率高但消耗内存大,是lunix下默认的模式;worker模式每个子进程有多个线程,内存消耗低,但一个线程崩溃会牵连其它同子进程的线程。
2)另外,Apache可以提供静态和动态的服务 ,例如对于PHP的解析不是通过性能较差的CGI实现的而是通过支持PHP的模块来实现的(通常为mod_php5,或者叫做apxs2)
3)缺点:
因此通常称为Apache的这种Serverprocess-based server ,也就是基于多进程的HTTPServer,因为它需要对每个用户请求创建一个子进程/线程进行响应;
这样的缺点是,如果并发的请求非常多(这在大型门户网站是很常见的)就会需要非常多的线程,从而占用极多的系统资源CPU和内存。因此对于并发处理不是Apache的强项。
4)解决方法:
目前来说出现了另一种WebServer,在并发方面表现更加优越,叫asynchronous servers异步服务器。最有名的为NginxLighttpd。所谓的异步服务器是事件驱动程序模式的event-driven,除了用户的并发请求通常只需要一个单一的或者几个线程。因此占用系统资源就非常少。这几种又被称为lightweight web server。举例,对于10,000的并发连接请求,nginx可能仅仅使用几M的内存;而Apache可能需要使用几百M的内存资源。
使用Apache来作为HTTPServer的情况我这里不再多做介绍;上面我们介绍到Apache对于PHP等服务器端脚本的支持是通过自己的模块来实现的,而且性能优越。
我们同样可以使用nginx或者lighttpd来作为HTTPServer来使用。
nginxApache类似都通过各种模块可以对服务器的功能进行丰富的扩展,同样都是通过conf配置文件对各种选项进行配置。对于PHP等,nginx没有内置的模块来对PHP进行支持,而是通过FastCGI来支持的。
nginx则没有自己提供处理PHP的功能,需要通过第三方的模块来提供对PHP进行FastCGI方式的集成。


Nginx(发音engine x)专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持3000050000个并发请求)。正因为如此,大量提供社交网站、新闻资讯、电子商务以及虚拟主机等服务的企业纷纷选择Ngnix来提供WEB服务。


2Nginx的安装及运行控制:


目前Nginx的最新稳定版本为1.0.8,开发版本为1.1.6,其安装文件可以从官方网站http://www.nginx.org下载,下面以稳定版为例,介绍nginx的安装和运行控制。

编译安装Nginx

1)安装支持软件:

Nginx的配置及运行需要pcrezlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。

 Nginx服务_中国大陆_02

2)创建运行用户、组:

Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。

 Nginx服务_engine_03

3)编译安装nginx

释放nginx源码包

 Nginx服务_搜索引擎_04

编译前配置:

 Nginx服务_代理服务器_05注:配置前可以参考:./configure --help给出说明

--prefix:设定Nginx的安装目录

--usergroup:指定Nginx运行用户和组

--with-http_stub_status_module:启用http_stub_status_module模块以支持状态统计

编译:

 Nginx服务_搜索引擎_06

安装:

 Nginx服务_中国大陆_07

至此Nginx安装完成,为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用Nginx的主程序。

 Nginx服务_搜索引擎_08

Nginx的运行控制:

apache的主程序httpd类似,Nginx的主程序也提供了-t选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录下的conf/子目录中。若要检查位于其他位置的配置文件,可使用-c选项来指定路径。

 Nginx服务_搜索引擎_09

启动、停止Nginx

直接运行nginx即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加-c 配置文件路径选项来指定路径。需要注意的是,若服务器中已安装有httpd等其他WEB服务软件,应采取措施避免部突。

 Nginx服务_中国大陆_10

通过检查Nginx程序的监听状态,或者在浏览器中访问此WEB服务(默认页面将显示“Welcome to nginx!”),可以确认Nginx服务是否正常运行。

 Nginx服务_代理服务器_11

或使用elinks浏览器(需安装elinks软件包。yum -y install elinks

 Nginx服务_代理服务器_12

注意:要在防火墙上允许80端口的通信。

停止Nginx服务:

#Killall -9 nginx

Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill命令,也可以根据nginx.pid文件中的PID号来进行控制。

为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfigservice工具来进行管理,也更加符合RHEL系统的管理习惯。

 Nginx服务_中国大陆_13

脚本内容如下:

 Nginx服务_搜索引擎_14

 Nginx服务_搜索引擎_15

注:通过killkillall命令发送HUP信号表示重载配置, 用新的配置开始新的工作进程
关闭旧的工作进程QUIT信号表示退出进程,KILL信号表示杀死进程。通过-s选项指定信号种类。

添加为系统服务。

 Nginx服务_中国大陆_16

这样一来,就可以通过nginx脚本来启动、停止、重启、重载Nginx服务器了。

3、配置文件nginx.conf

Nginx服务器的主配置文件nginx.conf中,包括全局配置、I/O事件配置、HTTP配置这三大块内容,配置语句的格式为关键字 值;(末尾以分号表示结束),以#开始的部分表示注释。

1)全局配置

由各种配置语句组成,不使用特定的界定标记。全局配置部分包括运行用户、工作进程数、错误日志、PID存放位置等基本设置。

常用配置项:

user nobody;

//运行用户,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody

worker_processes 2;

//指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般为它的倍数

worker_cpu_affinity 00000001 00000010;

//为每个进程分配cpu,上例中将2个进程分配到cpu,当然可以写多个,或者将一个

进程分配到多个cpu

worker_rlimit_nofile 102400;

//这个指令是指当一个nginx进程打开的最多文件数目,理论值应该是最多打开文件数(ulimit

-n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值

保持一致。(通过ulimit n 数值可以修改打开的最多文件数目)

error_log logs/error.log; //全局错误日志文件的位置

pid logs/nginx.pid; //PID文件的位置

2)I/O事件配置:

使用events {}界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置

events {

use epool; //使用epool模型,对于2.6以上的内核,建议使用epool模型以提高性能

worker_connections 4096; //每个进程允许的最多连接数(默认为1024)每个进程的连接数应根据实际需要来定,一般在10000以下,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。

}

3HTTP配置

使用http{}界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以

及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记servier {}内。

http {
#设定mime类型,即conf/目录下的mime.types文件中的设定。
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local]'
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '

'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#设定access log
access_log logs/access.log main;
sendfile on; //支持文件发送(下载)
keepalive_timeout 65; //连接保持超时
#设定虚拟主机
server { //用来配置虚拟主机
listen 80; //WEB服务的监听设置,可以采用IP地址:端口形式
server_name www.lnmp.com;//网站名,称可以写多个名称,用空格分隔

location / { //表示如何匹配后面的路径的

index index.html;//默认首页

root html; //网页根目录位置,默认为Nginx安装目录下的html/子目录,root语句用来设置特定访问位置的网页文档路径,根据需要可改为/var/www/html等其他路径。

}

charset gb2312; //网页的默认字符集
#设定本虚拟主机的访问日志
access_log logs/www.lnmp.com.access.log main;

error_page 500 502 503 504 /50x.html; //内部错误的反馈页面

location = /50x.html {

root html;

}
}
}

Nginxlocation

基本语法:
location [=|~|~*|^~] /uri/ { … }

=表示做精确匹配
~:为区分大小写匹配
~*: 为不区分大小写匹配
!~:!~* 分别为区分大小写不匹配及不区分大小写不匹配

正则表达式匹配,其中:
文件及目录匹配,其中:
-f !-f 用来判断是否存在文件
-d!-d 用来判断是否存在目录
-e!-e 用来判断是否存在文件或目录
-x !-x 用来判断文件是否可执行

示例1:

location = / {
# 只匹配 / 查询。
}

location / {

#匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配

}

示例2:

location ^~ /p_w_picpaths/ {
# 匹配任何以 /p_w_picpaths/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}

示例3:

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以 gifjpg jpeg 结尾的请求。
}

4、状态统计及虚拟主机应用:

1) Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的WEB访问情况。配置

编译参数时可添加with-http_stub_stastus_module来启用此模块。要使用Nginx的状态统计功能,除了启用内建模块以外,还需要修改nginx.conf文件,指定访问位置并打开stub_status配置。在http{}配置的server{}子配置内添加如下配置项

 Nginx服务_代理服务器_17

注:location /tongji //匹配任何包含/tongji的任何查询

stub_status on //打开状态统计功能

Access_log off //关闭此位置的日志记录

Nginx 支持为目录添加密码认证,使用apache htpasswd 来创建密码文件

htpasswd -c/usr/local/nginx/.htpasswd 用户名

保存修改过的nginx.conf文件并重启nginx服务使修生效。

新的配置生效后,在浏览器中访问Nginx服务器的/tongji网站位置(http://web服务器

IP/tongji)可以看到状态统计信息

 Nginx服务_代理服务器_18

如上图所示:

active connections — 发起的活动连接数

server accepts handled requests — nginx 总共处理了 2 个连接, 成功创建 2 次握手 (证明中间没有失败的), 总共处理了 4 个请求 (平均每次握手处理了 2个数据请求)

客户端访问控制:

 Nginx服务_搜索引擎_19

注:allow 允许规则,deny拒绝规则;规则的执行是按从上向下执行,匹配某条规则后将不

再检查其他规则。

2)虚拟主机:

使用Nginx搭建虚拟主机服务器时,每个虚拟WEB站点拥有独立的server {}配置段,各自

监听的IP地址、端口号可以单独指定,当然网站名称也是不同的。

例如:要创建两个站点www.benet.comwww.accp.com

为两个虚拟WEB主机分别建立根目录,并准备测试首页

 Nginx服务_搜索引擎_20

调整nginx.conf配置文件---域名虚拟主机

配置两个server {}区域,分别对应两个WEB站点,指定各自的网站名称、监听地址、网站

根目录、访问日志等信息,然后重载配置

 Nginx服务_中国大陆_21

测试:使用浏览器分别通过www.benet.comwww.accp.com访问两个WEB站点(注意域

名解析。

5LEMP架构及应用部署:

就像构建LAMP平台一样,构建LEMP平台也需要LINUX服务器、MYSQL数据库、PHP解析

环境,区别主要在于NginxPHP的协作配置上

1) 以编译方式安装Nginx(过程参照上面相关介绍完成)

2) 安装MYSQL数据库----------以编译方式安装

释放MYSQL的源码包:

 Nginx服务_代理服务器_22

编译前配置:

 Nginx服务_engine_23

注:--with-charset:指定默认使用的字符集编码;--with-collation:指定默认使用的字符集校对规则,utf8_general_ci是适用于UTF-8字符集的通用规则;--with-extra-charsets:指定额外支持的其他字符集编码。

编译并安装MYSQL

 Nginx服务_代理服务器_24

优化调整:

 Nginx服务_engine_25

 Nginx服务_搜索引擎_26

初始化数据库:

 Nginx服务_engine_27

 Nginx服务_代理服务器_28

启动MYSQL服务及为root用户设置密码:

 Nginx服务_中国大陆_29

1) 安装PHP解析环境:

较新版本(如5.3)的PHP已经自带FPM(fastCGI process manager,FastCGI进程管理器)模块,用来对PHP解析实例进行管理,优化解析效率,因此在配置PHP编译选项时应添加--enable-fpm以启用此模块。

为了提高PHP解析效率,建议将相应版本的ZendGuardLander也装上

释放PHP源码包:

 Nginx服务_搜索引擎_30

编译前配置:

 Nginx服务_代理服务器_31

注:在RHEL664系统中按上面的配置项配置可能会报以下错误,如果要是报错的话请按如下方法解决:

 Nginx服务_engine_32

解决方法:

根据报错发现是因为libpng.solibpng.a找不到,但libpng的相关软件包我已经安装了,如下图查询结果,发现libpng的包都安装了。

 Nginx服务_engine_33

那为什么还报libpng.solibpng.a找不到呢?

要解决问题就是它没找到,我安装了的,那我得去找找看它到底是放那里去了。执行下列命令,可以查找libpng.so在那里。

 Nginx服务_搜索引擎_34

 Nginx服务_engine_35

通过上面的搜索其实就知道一些原因了,configure一般的搜索编译路径为/usr/lib/,因为php默认就在/usr/lib/下找相关库文件,x64机器上是在:/usr/lib64.这时你就可以直接把需要的库文件从/usr/lib64中拷贝到/usr/lib/中去就可以了

 Nginx服务_搜索引擎_36

解决完后重新执行./configure进行编译前的配置

如果报configure: error: libjpeg.(a|so) not found错误解决方法和上面的解决方法类似。具体操作如下:

 Nginx服务_engine_37

 Nginx服务_搜索引擎_38

如果报下面错误

usr/bin/install: cannot create regular file `/usr/local/man/man1/cjpeg.1': No such file or directory
make: *** [install] Error 1
提示找不到目录。既然电脑找不到,咱们人脑可以找嘛,自己先创建先
mkdir /usr/local/man
mkdir /usr/local/man1 创建完了再来

类似错误很多,方法也很多,我们得灵活应变,具体问题具体分析!

编译并安装PHP

 Nginx服务_engine_39

注:

安装后的调整:

 Nginx服务_engine_40

安装ZendGuardLander(注:若RHEL664位系统,该软件得到其官网下载64位的相应软件包,若用32位的就会报错。下载地址:http://www.zend.com/en/products/guard/downloads)

 Nginx服务_代理服务器_41

修改php.ini文件:

 Nginx服务_中国大陆_42

php.ini中添加如下配置

 Nginx服务_中国大陆_43

配置Nginx支持PHP环境:

若要让Nginx能够解析PHP网页,有两种方法可以选 择;其一,充当中介,将访问PHP页面的WEB请求转交给其他服务器(LAMP)去处理;其二,通过使用PHPFPM模块来调用本机的PHP环境

如果选用FPM方式,则需要先启动php-fpm进程,以便监听PHP解析请求。参考范例建立php-fpm.conf配置文件,并修改其中的PID文件、运行用户、服务数(进程数量)等相关设置,然后启动php-fpm程序即可(默认监听本机的9000端口)

 Nginx服务_中国大陆_44

 Nginx服务_中国大陆_45

修改内容如下:

 Nginx服务_中国大陆_46

//确认pid文件位置

 Nginx服务_代理服务器_47

//运行用户和运行组

 Nginx服务_中国大陆_48

//启动时开启的进程数、最少空闲进程数、最多空闲进程数

按以上提示修改php-fpm.conf文件,改完后保存退出。

启动php-fpm并查看地址监听。

 Nginx服务_代理服务器_49

php-fpm.conf文件中,pid配置行指出了PID信息的存放位置,对应的实际路径为/usr/local/php5/var/run/php-fpm.pid,根据上述信息,可以修改Nginx服务脚本,以便在启动/停止Nginx服务器时将php-fpm进程也自动启动/停止。

 Nginx服务_代理服务器_50

nginx服务脚本中添加如下内容:

 Nginx服务_中国大陆_51

这样一为,一旦启动或关闭nginx服务,php-fpm程序也会随之启动或关闭,不需要额外再启动或关闭php-fpm.

1) 配置Nginx支持PHP解析:

无论是将PHP页面交给LAMP服务器去解析,还是调用本机的php-fpm进程进行解析,都需要在server{}配置段中添加location设置,以便指定当访问.php面页时采取何种操作。

对于第一种方法(转交给其他WEB服务器处理),使用的配置语句如下所示,例如,交给IP地址为192.168.0.200LAMP服务器处理,从而实现由Nginx负责静态页面,LAMP负责动态页面的分离效果。

server {

…… //省略部分信息

location ~ \.php$ { //访问.php页面的配置段

proxy_pass http://192.168.0.200:80; //APACHE服务器的监听地址

}

上面这种写法只是发送以.php为后缀的页面访问请求给其他WEB服务器,如果有其格式的文件访问(如:htmljpg等)就会出问题。访问不了了。

或者

location / { //访问.php页面的配置段

proxy_pass http://192.168.0.200:80; //APACHE服务器的监听地址

}

}

对于第二种方法(调用本机的php-fpm进程),使用的配置语句如下所示。在conf/目录下的fastcgi.conf文件中已经包含必需的宏设置,可通过include语句添加进来。

server {

…… //省略部分信息

location ~ \.php$ { //访问php页面的配置段

root /var/www/benet; //PHP网页文档根目录

fastcgi_pass 127.0.0.1:9000; //php-fpm的监听地址

fastcgi_index index.php; //PHP首页文件

include fastcgi.conf; //包括fastcgi.conf样本配置

}

}

本文档中我选择的是第二种方法,完成修改后重新加载nginx服务即可生效。

 Nginx服务_engine_52

PHP页面访问测试:

PHP文档根目录下创建一个测试网页,以便测试PHP语名能否正常解析,以及能否访问MYSQL数据库。测试页内容如下 :

 Nginx服务_代理服务器_53

 Nginx服务_中国大陆_54

然后访测试页如:http://www.benet.com/test.php若能看到成功提示信息表示一切正常。

1) LEMP平台中部署WEB应用:

LEMP平台与LAMP平台是非常相似的,区别主要在于所用WEB服务软件的不同,而这与使用PHP开发的WEB应用程序并无太大关系,因此PHP应用的部署方法也是类似的,

下面以“天空网络电影系统(简称SKYUC)”为例介绍在LEMP平台中的部署过程。

释放并部署程序代码:

 Nginx服务_engine_55

创建数据库:

 Nginx服务_中国大陆_56

安装WEB应用:

访问http://www.benet.com/skyuc/install/index.php,将会打开SKYUC的安装程序,根据页面提示,只需三步即可完成安装。要注意适当调整权限,最简单方法是:

 Nginx服务_engine_57

完成安装后,注意将install/目录转移,以避免重复安装,降低安全风险。

 Nginx服务_中国大陆_58

访问WEB应用系统:

通过访问http://www.benet.com/skyuc就可以访问了。

架设Discuz论坛:

建立用于bbs论坛的数据库及用户:

 Nginx服务_搜索引擎_59

解压下载的软件包,上传程序文件:

 Nginx服务_engine_60

 Nginx服务_搜索引擎_61

 Nginx服务_engine_62

在浏览器中访问http://www.benet.com/bbs/install根据向导页面的提示进行安装

注:请将 php.ini 中的 short_open_tag 设置为 On然后重启WEB服务,否则程序无法正常运行,修改后要重启nginx服务。

通过访问http://www.benet.com/bbs就可以访问了。