Nginx网站服务的基本构建

一关于Nginx服务

·Nginx简介

Nginx (发音[engine x]) 是一款高性能、轻量级Web服务软件;

始用于俄罗斯的Rambler.ru站点

市场占有率迅速跃居第三位

官方网站 http://www.nginx.org/

·Nginx与Apache的优缺点

1 Apache对客户端的响应是支持并发的,运行httpd这个daemon进程之后,它会同时产生多个子进程/线程,每个子进程/线程分别对客户端的请求进行响应;

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

prefork每个子进程只有一个线程,效率高但消耗内存大,是lunix下默认的模式;worker模式每个子进程有多个线程,内存消耗低,但一个线程崩溃会牵连其它同子进程的线程

3 Apache可以提供静态和动态的服务,例如对于PHP的解析不是通过性能较差的CGI实现的而是通过支持PHP的模块来实现的(通常为mod_php5,或者叫做apxs2)

4 Apache需要对每个用户请求创建一个子进程/线程进行响应,这样的缺点是,如果并发的请求非常多(这在大型门户网站是很常见的)就会需要非常多的线程,从而占用极多的系统资源CPU和内存。因此对于并发处理不是Apache的强项

5 nginx则没有自己提供处理PHP的功能,需要通过第三方的模块来提供对PHP进行FastCGI方式的集成

6 nginx最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)

二 Nginx的安装

·Nginx的安装步骤

1卸载Apache

避免发生冲突,应该卸载http的服务

2安装依赖包pcre-devel、zlib-devel

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

3创建运行用户、组

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

4编译安装nginx

注:配置前可以参考:./configure --help给出说明

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

--user和—group:指定Nginx运行用户和组

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

·Nginx的运行控制

1建立符号链接

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

2检查配置文件

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

3启动、停止Nginx

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

启动Nginx服务

通过检查 Nginx程序的监听状态,或者在浏览器中访问此WEB服务(默认页面将显示"Welcome to nginx!"),可以确认Nginx服务是否正常运行(要在防火墙上允许80端口的通信)

停止、重载Nginx服务

主程序Nginx支持标准的进程信号,通过kill或killall命令发送HUP信号表示重载配置、QUIT信号表示退出程序,kill信号表示杀死进程

4使用Nginx服务脚本

为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和service工具来进行管理,也更加符合RHEL系统的管理习惯;当Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中;

脚本内容如下

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

三 Nginx的配置

·配置文件nginx.conf

在Nginx服务器的主配置文件nginx.conf中(位于/usr/local/nginx/conf/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响应模型,每个进程的连接数等设置

常用配置项:

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

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

3 HTTP配置

使用"http{}"界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持、以及虚拟主机、PHP解析等一系列设置。其中大部分配置语句包含在子界定标记"servier {}"内

此处只需去掉日志格式的注释,时期启用,其他默认

下面以server开头的配置项就是默认的一个web监听站点,可以修改使用,也可以自定义多个虚拟主机

在配置文件的最后自定义虚拟主机

server {

    //用来配置虚拟主机

listen 80;     //WEB服务的监听设置,可以采用"IP地址:端口"形式

server_name ;        //网站名,称可以写多个名称,用空格分隔

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;

}

}

多个虚拟主机根据实际环境设置;如基于域名的虚拟主机,有几个虚拟主机,就添加几个server配置;基于端口的虚拟主机,可以指定不同端口;基于IP的虚拟主机,可以指定IP

·location基本语法

Location就是用来指定首页和默认路径的;决定了我们在浏览器里输入的地址路径;这里的路径有很多种表示方法以及查询形式;

location [=|~|~*|^~] /uri/ { … }

=    表示做精确匹配

~ :为区分大小写匹配

~*: 为不区分大小写匹配

!~ :和 !~* 分别为区分大小写不匹配及不区分大小写不匹配

正则表达式匹配,其中:

文件及目录匹配,其中:

-f 和 !-f 用来判断是否存在文件

-d 和 !-d 用来判断是否存在目录

-e 和 !-e 用来判断是否存在文件或目录

-x 和 !-x 用来判断文件是否可执行

示例1:

location = / {

# 只匹配 / 查询。

}

location / {

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

}

示例2:

location ^~ /images/ {

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

}

示例3:

location ~* \.(gif|jpg|jpeg)$ {

# 匹配任何以 gif、jpg 或 jpeg 结尾的请求。

}

·状态统计及虚拟主机应用

1状态统计

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

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

注: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)可以看到状态统计信息

需要输入用户名和密码才能看

active connections 1     发起的活动连接数

server accepts handled requests     

总共处理了 2 个连接, 成功创建 2 次握手 (证明中间没有失败的), 总共处理了6 个请求 (平均每次握手处理了3个数据请求)

2客户端访问控制

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

再检查其他规则

3虚拟主机

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

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

例如:(基于域名的虚拟主机)要创建两个站点www.benet.com和www.accp.com

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

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

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

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

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

名解析。