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:
[root@localhostServer]# rpm -ivh pcre-devel-6.6-2.el5_1.7.i386.rpm
[root@localhost~]# tar -zxvf libevent-2.0.16-stable.tar.gz -C /usr/local/src/
[root@localhost~]# cd /usr/local/src/libevent-2.0.16-stable/
[root@localhostlibevent-2.0.16-stable]# ./configure --prefix=/usr/local/libevent
[root@localhostlibevent-2.0.16-stable]# make && make install
[root@localhostlibevent-2.0.16-stable]# cd /usr/local/libevent/
为了系统能其他的程序能够调用libevent的头文件和库文件我们需要进行下面的操作:
[root@localhostlibevent]# ln -s /usr/local/libevent/include /usr/include/libevent
[root@localhostlibevent]# vim /etc/ld.so.conf.d/libevent.conf 文件内容如下:
[root@localhostlibevent]# ldconfig
安装nginx,由于是源代码我们需要拆解配置和安装:
由于nginx是系统服务,运行此服务需要系统账户,所以我们要创建系统账户nginx
[root@localhost~]# groupadd nginx
[root@localhost~]# useradd -r -g nginx -s /sbin/nologin -M nginx
[root@localhost~]# tar -zxvf nginx-1.5.4.tar.gz -C /usr/local/src/
[root@localhost~]# cd /usr/local/src/nginx-1.5.4/
[root@localhostnginx-1.5.4]# ./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
[root@localhostnginx-1.5.4]# make && make install
安装完成后,会在安装目录下产生下面两个目录:
接着去创建/var/tmp/nginx/client、/var/tmp/nginx/proxy、/var/tmp/nginx/fcgi目录:
[root@localhost~]# mkdir -pv /var/tmp/nginx/client
[root@localhost~]# mkdir -pv /var/tmp/nginx/proxy
[root@localhost~]# 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"\t\t\t\t\t\t"`
start(){
[ -f $lockfile ] && echo"nginx is started." && exit
echo -n "nginx is starting.."
sleep 1 && echo -n"."
$prog && echo -e "$space[\033[32m OK\033[0m]" && touch $lockfile || echo -e "$space[\033[31m failed\033[0m]"
}
stop(){
[ ! -f $lockfile ] && echo"nginx is stopped." && exit
echo -n "nginx is stopping.."
sleep 1 && echo -n"."
$prog -s stop && echo -e "$space[\033[32m OK \033[0m]"&& rm -f $lockfile || echo -e"$space[\033[31m failed \033[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
现在可以执行chkconfig–add nginx来实现chkconfig 管理,也可以使用chkconfig–list nginx查看nginx服务在何种级别的开启与关闭的状态。
启动nginx服务,我们访问http://192.168.2.10 :
说明我们web可以正常运行了。当然nginx实现的web服务器同apache实现的web服务器一样,也可以做基于虚拟目录、主机头、ip地址的虚拟站点。
基于ip地址的虚拟站点实现:
为了达到实验的目的,给我们的linux主机再配置一个临时地址
[root@localhost~]# 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:\Windows\System32\drivers\etc\hosts,linux下/etc/hosts)
现在分别访问http://www.abc.com和http://tec.abc.com :
基于虚拟目录的虚拟主机就非常简单了,基于虚拟目录的访问不管真正的存放网页的目录在任何位置,我们都能让它基于某个目录实现访问:
我们就随意创建个目录/abc,在该目录下新建一个index.html的网页,接着我们以上nginx的配置文件稍作修改:
[root@localhost/]# mkdir /abc
[root@localhost/]# 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正常访问了!
本文出自 “夜风” 博客,请务必保留此出处http://jiangkun08.blog.51cto.com/6266992/1293456