/ 中存储网

CentOS系统使用Nginx搭建web服务器

2013-11-23 11:26:02 来源:kejihao

Nginx的安装实现web功能

nginx是由俄罗斯人开发的一种实现web服务器的工具,主要是为俄罗斯的第三大门户网站实现反向代理加速的服务器。nginx只能对http和mail服务器实现反向代理加速,但是其速度比squid 、varnish等实现的反向代理加速要快的多,可以说是无与伦比的。

nginx与apache的区别:

apache 在处理用户请求时采用的是进程,若采用prefork的mpms机制,apache在每个时刻都要保持8个空闲的子进程,当用户请求过多时,开启的进程较多,占用内存大,效率与nginx相比较低,每秒最多的并发连接请求最多不超过3000个。但是apache有个优点就是非常稳定,当一个进程死掉时,不会影响其他的用户。而nginx在处理用户请求时采用的是线程,而线程是共享内存的,nginx只需要开启少量进程,多个线程就可以共享进程的内存,占用内存小,nginx采用的是epoll机制(事件主动通知机制)每秒最多的并发连接请求理论可以达到50000个。但是nginx的缺点是,稳定性差,当一个进程死掉时,会影响到多个用户的使用。

废话不说了,下面就使用nginx实现web功能:

环境:rhel 5.4

软件:nginx-1.5.4.tar.gz

libevent-2.0.16-stable.tar.gz  由于nginx采用的是epoll机制需要事件库的支持

pcre-devel-6.6-2.el5_1.7.i386.rpm          支持正则表达式的库

搭建支持nginx的环境,首先安装pcre-devel和libevent:

[[email protected]]# rpm -ivh pcre-devel-6.6-2.el5_1.7.i386.rpm

[[email protected]~]# tar -zxvf libevent-2.0.16-stable.tar.gz -C /usr/local/src/

[[email protected]~]# cd /usr/local/src/libevent-2.0.16-stable/

[[email protected]]# ./configure --prefix=/usr/local/libevent

[[email protected]]# make && make install

[[email protected]]# cd /usr/local/libevent/

为了系统能其他的程序能够调用libevent的头文件和库文件我们需要进行下面的操作:

[[email protected]]# ln -s /usr/local/libevent/include /usr/include/libevent

[[email protected]]# vim /etc/ld.so.conf.d/libevent.conf     文件内容如下:

[[email protected]]# ldconfig

安装nginx,由于是源代码我们需要拆解配置和安装:

由于nginx是系统服务,运行此服务需要系统账户,所以我们要创建系统账户nginx

[[email protected]~]# groupadd nginx

[[email protected]~]# useradd -r -g nginx -s /sbin/nologin -M nginx

[[email protected]~]# tar -zxvf nginx-1.5.4.tar.gz -C /usr/local/src/

[[email protected]~]# cd /usr/local/src/nginx-1.5.4/

[[email protected]]# ./configure      

>--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  

>--user=nginx  

>--group=nginx  

>--with-http_ssl_module

>--with-http_flv_module

>--with-http_stub_status_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/

>--with-pcre

[[email protected]]# make && make install

安装完成后,会在安装目录下产生下面两个目录:

接着去创建/var/tmp/nginx/client、/var/tmp/nginx/proxy、/var/tmp/nginx/fcgi目录:

[[email protected]~]# mkdir -pv /var/tmp/nginx/client

[[email protected]~]# mkdir -pv /var/tmp/nginx/proxy

[[email protected]~]# mkdir -pv /var/tmp/nginx/fcgi

然后修改/etc/profile环境文件加入下面一句话,后并使用 . /etc/profile 命令重新读取环境文件使得修改后的内容生效:

接着为了方便我们管理,我们需要写nginx的控制脚本,一般程序的控制脚本存放在/etc/init.d/目录下,所以我们在此目录下创建nginx文件并且修改其权限为可执行nginx的内容如下:

#!/bin/bash

# chkconfig: 2345 65 45

# description: nginx serverdaemon

prog=/usr/local/nginx/sbin/nginx

lockfile=/var/lock/nginx.lock

pidfile=/var/run/nginx/nginx.pid

space=`echo"tttttt"`

start(){

[ -f $lockfile ] && echo"nginx is started." && exit

echo -n "nginx is starting.."

sleep 1 && echo -n"."

$prog &&  echo -e  "$space[33[32m OK33[0m]" && touch $lockfile || echo  -e "$space[33[31m failed33[0m]"

}

stop(){

[ ! -f $lockfile ] && echo"nginx is stopped." && exit

echo -n "nginx is stopping.."

sleep 1 && echo -n"."

$prog -s stop && echo  -e "$space[33[32m OK 33[0m]"&& rm -f $lockfile || echo  -e"$space[33[31m failed 33[0m]"

}

status(){

[ ! -f $pidfile ] && echo"nginx is stoped" || echo "`cat $pidfile`,nginx is running"

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

stop

start

;;

status)

status

;;

*)

echo "UASGE IS:start|stop|restart|status"

;;

Esac

现在可以执行chkconfigCadd nginx来实现chkconfig 管理,也可以使用chkconfigClist nginx查看nginx服务在何种级别的开启与关闭的状态。

启动nginx服务,我们访问http://192.168.2.10 :

说明我们web可以正常运行了。当然nginx实现的web服务器同apache实现的web服务器一样,也可以做基于虚拟目录、主机头、ip地址的虚拟站点。

基于ip地址的虚拟站点实现:

为了达到实验的目的,给我们的linux主机再配置一个临时地址

[[email protected]~]# ifconfig eth0:0 192.168.2.20

修改nginx的配置文件,如下:

server {

listen       192.168.2.10:80;

server_name  localhost;

access_log  /var/log/nginx/access.log;

error_log  /var/log/nginx/error.log;

location / {

root   html;

index  index.html index.htm;

}

}

server {

listen       192.168.2.20:80;

server_name  localhost;

access_log  /var/log/nginx/tec_access.log;

error_log  /var/log/nginx/tec_error.log;

location / {

root   /usr/local/nginx/tec;

index  index.html index.htm;

}

}

然后创建/usr/local/nginx/tec目录,进入该目录创建一个index.html网页,重启nginx服务后,分别访问http://192.168.2.10和http://192.168.2.20 :

基于主机头的虚拟主机只需要在上面的基础上稍作修改:

server{

listen       192.168.2.10:80;

server_name  www.abc.com;

location / {

root   html;

index  index.html index.htm;

}

}

server {

listen       192.168.2.10:80;

server_name  tec.abc.com;

location / {

root   /usr/local/nginx/tec;

index  index.html index.htm;

}

}

为了实现基于域名的访问,要么做DNS域名解析,要么就修改主机的hosts文件,我就偷下懒,修改hosts文件(注意hosts文件的位置:windows下C:WindowsSystem32driversetchosts,linux下/etc/hosts)

现在分别访问http://www.abc.com和http://tec.abc.com :

基于虚拟目录的虚拟主机就非常简单了,基于虚拟目录的访问不管真正的存放网页的目录在任何位置,我们都能让它基于某个目录实现访问:

我们就随意创建个目录/abc,在该目录下新建一个index.html的网页,接着我们以上nginx的配置文件稍作修改:

[[email protected]/]# mkdir /abc

[[email protected]/]# echo "this is just a test" >/abc/index.html

在配置文件的tec.abc.com的server内增加这样一个location:

location /test {

alias   /abc;

index index.html index.htm;

}

这次访问一下http://tec.abc.com/test:

同样nginx也能同apache一样实现https-加密访问。所谓加密访问就是要http与安全套接层ssl结合,实现站点的安全性。关于web站点实现ssl安全的原理你可以查看kunjiang的另一篇博客《apache的站点安全》。

首先要搭建CA服务器,用于向用户或者服务器签发证书,那么现在就搭建CA服务器:

修改/etc/pki/tls/openssl.cnf文件,需要修改的内容如下:

45  dir             = /etc/pki/CA

88  countryName             = optional

89  stateOrProvinceName     = optional

90  organizationName        = optional

136 countryName_default             = CN

141 stateOrProvinceName_default     =henan

144 localityName_default            = Zhengzhou

内容修改之后,我们需要在/etc/pki/CA目录下去创建三个目录(certs、crl、newcerts)和两个文件(index.txt、serial),并且将内01这个数字写入serial文件。这些准备做好之后,就可以去实现CA服务器了:

我们使用openssl为CA产生私钥,私钥名字为cakey.pem存放在/etc/pki/CA/private/目录下,为了私钥的安全性,必须修改cakey.pem的权限为600:

由于本CA服务器要想为其他人服务,那么它必须是一个别人可以信任的机构,需要根CA给他签发证书,在我们的环境中只有这一台CA服务器,那么它就是根CA,它的证书需要自己签署。

CA服务器的操作已经完成,我们要为我们的web服务器签发证书,那么必须要有请求文件,产生请求文件靠的是私钥文件,所以web服务器签发证书的过程是私钥文件à请求文件à证书:

我们先在/usr/local/nginx目录下创建cert目录用于存放服务器的上面三个文件,然后切换到cert目录去产生这三个文件:

现在我们要将证书与web结合,那么我们就需要修改nginx的配置文件,在http的大括号内加入下面这段内容:

重启nginx服务:

现在我们访问https://www.abc.com出现下面的页面:

说明客户端不信任我们的证书,要想客户端信任我们的证书,必须先让其信任我们的证书颁发机构CA,我们必须把CA加入到信任列表。要想加入到信任列表必须要在证书路径那出现完整路径。

这里操作与apache的加密访问时有点区别,在这里为了出现完整路径,我们必须把CA的证书与web的证书合并。

再次访问https://www.abc.com :

然后根据向导进行操作:

导入成功,打开控制台(开始à运行àmmc)添加证书,可以看到已经将根CA加入到可信任的根机构:

此时,已经可以基于https正常访问了!