一、简介
Web服务器:
1.Apache:仍然是世界上用得最多的Web服务器。优势:源代码开放、有一支开放的开发队伍、支持跨平台(可运行在几乎所有的Unix、Windows、Linux系统上),可移植性等。属于重量级产品,所消耗的内存比其他服务器高。
2.Lighttpd:德国人写的开源原件。优点:内存开销低、CPU占用率低、效能好、模块丰富等特点。支持FastCGI、CGI、Auth、输出压缩、URL重写及Alias等重要功能。轻量级Web服务器。
3.Tomcat:开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。实行了Apache-Jakarta规范,但是对静态文件、高并发处理较弱。
4.IBM WebSphere:基于Java的应用环境建立、部署、管理Internet和Web应用程序
5.Microsoft IIS:微软,IIS提供图形界面的管理工具,可用于监视配置和控制Internet服务。只能运行在Microsoft Windows平台、Linux/Unix平台上,需要购买商业Windows Server操作系统。
6.Nginx:俄罗斯人Igor Sysoev编写的一款HTTP和反向代理服务器。在高并发情况下,Nginx是Apache服务器不错的替代品,能支持高达50000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。
Nginx的优势:
1.支持高并发连接:官测5万并发,实产2~4万并发。这得益于Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freebsd)网络I/O模型,而Apache使用的则是传统的select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU等服务器资源要比Nginx高得多。在处理大量连接的读写,Apache所采用的select网络I/O模型非常低效。
2.内存消耗少:Nginx+PHP(FastCGI)服务器在3万并发连接下,总消耗不到2GB内存。Nginx+PHP5(FastCGI)服务器处理PHP动态程序能力超过“700次请求/秒”,相当于每天承受6000万访问量。
3.成本低廉:购买硬件负载均衡交换机需要十几万甚至几十万RMB,而Nginx为开源软件,采用2-clause BSD-like协议,可以免费使用,并且可用于商业用途。
4.其他优点:
a.配置文件非常简单
b.支持Rewrite重写规则
c.内置的健康检查功能
d.节省带宽
e.稳定性高
f.支持热部署
总结:Nginx在反向代理、Rewrite规则、稳定性、静态文件处理、内存消耗等方面都表现出很强的优势。
二、Nginx服务器的安装与配置
Windows版:
官网下载完成后,解压缩到一个不包含空格的路径中,执行nginx.exe即可。Windows版本的Nginx性能要比Linux/Unix版本Nginx差很多。
Linux版:
安装Nginx服务器之前,要安装一个Linux/Unix操作系统发行版(CentOS-6.3)
CentOS完全免费,修正了RedHat的很多BUG,但是CentOS不向用户提供技术支持,也不服任何商业责任。
(1)编译Nginx的要求:
1> 磁盘空间:需要保证有10MB以上的剩余磁盘空间。
2> GCC编译器及相关工具:#yum -y install gcc gcc-C++ autoconf automake
3> 模块依赖性:Nginx的一些模块需要其他第三方库的支持:#yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
(2)Nginx下载:
http://www.nginx.net/网站
(3)Nginx安装:
1> Windows下安装:下载压缩包,解压到一个不包含空格的路径中,然后在"开始"->"运行"->"cmd"中执行DOS命令即可启动Nginx:
d:
cd d:\nginx
start nginx
如果要对Nginx进程进行控制,可使用DOS命令:nginx -s [stop | quit | reopen | reload]
2> Linux环境下安装:
#tar -zxvf nginx-0.x.xx.tar.gz
#cd nginx-0.x.xx
#./configure
#make
#sudo make install
默认会装在/usr/local/nginx目录下
(4)Nginx的启动、停止
1> 启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
参数"-c"指定了配置文件的路径,如果不加"-c"参数,Nginx会默认加载器安装目录的conf子目录中的nginx.conf文件
2> 停止
Nginx停止方法很多,一般通过发送系统型号给Nginx主进程的方式来停止Nginx
查找Nginx的主进程号:#ps -ef | grep nginx
一个Nginx进程的备注信息为"master process"表示为主进程,它的进程号为主进程号
a.从容停止Nginx
#kill -QUIT Nginx 主进程号
或
#kill -QUIT `/usr/local/webserver/nginx/logs/nginx.pid`
b.快速停止Nginx
#kill -TERM Nginx 主进程号
#kill -TERM `/usr/local/webserver/nginx/logs/nginx.pid`
或
#kill -INT Nginx 主进程号
#kill -INT `/usr/local/webserver/nginx/logs/nginx.pid`
c.强制停止所有Nginx进程
#pkill -9 nginx
(5)Nginx的平滑重启
如果改变Nginx的配置文件(nginx.conf)想要重启Nginx同样可以通过发送系统信号给Nginx主进程的方式来进行。重启之前,要确认Nginx配置文件语法是否正确:
#/usr/local/webserver/nginx/sbin/nginx -t -c
#/usr/local/webserver/nginx/conf/nginx.conf
如果配置不正确会提示第几行出错,正确会显示两行提示信息。
正确了就可以平滑重启Nginx了:
#kill -HUP Nginx 主进程号
#kill -HUP `/usr/local/webserver/nginx/logs/nginx.pid`
(6)Nginx的信号控制
支持以下几种信号:
TERM,INT 快速关闭
QUIT 从容关闭
HUP 平滑重启
USR1 重新打开日志文件,在切割日志时用途较大
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
三、Nginx的基本配置与优化
1.Nginx的完整配置示例(Page45~Page47)
Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf
2.Nginx的虚拟主机配置
在Nginx配置文件(nginx.conf)中,一个最简化的虚拟主机配置:
----------------------------------------------------------------------------
http
{
server
{
listen 80 default;
server_name _ *;
access_log logs/default.access.log combined;
location / {
index index.html index.php;
root /data0/htdocs/htdocs;
}
}
}
---------------------------------------------------------------------------
跟Apache一样,Nginx也可以配置多种类型的虚拟主机:一是基于IP的虚拟主机,二是基于域名的虚拟主机,三是基于端口的虚拟主机
I.配置基于IP的虚拟主机
Linux、FreeBSD操作系统都允许添加IP别名。IP别名背后的概念:可以在一块物理网卡上绑定多个IP地址。这样就能够在使用单一网卡的同一服务器上运行多个基于IP的虚拟主机。在Linux上,可以使用标准网络配置工具(ifconfig和route命令)添加IP别名。
本地回环代表设备的本地虚拟接口,所以默认被看做永远不会宕掉的接口。主要作用:①测试本机网络配置,能ping通127.0.0.1说明本机的网卡和IP协议安装都没有问题;②某些SERVER/CLIENT的应用程序在运行时须调用服务器上的资源,一般要指定SERVER的资源装在本机上,SERVER的IP地址设为127.0.0.1也同样可以运行
在eth0网卡设备上添加两个IP别名192.168.149.132和192.168.149.232可以通过ifconfig和route命令来进行:
#/sbin/ifconfig eth0:1 192.168.149.132 broadcast 192.168.149.255 netmask 255.255.255.0 up
#/sbin/route add -host 192.168.149.132 dev eth0:1
#/sbin/ifconfig eth0:2 192.168.149.232 broadcast 192.168.149.255 netmask 255.255.255.0 up
#/sbin/route add -host 192.168.149.232 dev eth0:2
这时候执行ifconfig命令可以看到eth0网卡设备上绑定了两个IP别名,但是重启后会IP别名会消失,也可以通过配置文件设置IP别名,将上面两条ifconfig和route命令添加到/etc/rc.local文件中,让系统开机自动运行。
接下来在Nginx配置文件(nginx.conf)中,分别对192.168.149.32、192.168.149.132、192.168.149.232三个IP配置三个纯静态HTML支持的虚拟主机。
--------------------------------------------------------------------------
http
{
#第一个虚拟主机
server
{
#监听的IP和端口
listen 192.168.149.32:80;
#主机名称
server_name 192.168.149.32;
#访问日志文件存放路径
access_log logs/server1.access.log combined;
location /
{
#默认首页文件,从左到右
index index.html index.htm;
#HTML网页存放目录
root /data0/htdocs/server1;
}
}
}
http
{
#第二个虚拟主机
server
{
#监听的IP和端口
listen 192.168.149.132:80;
#主机名称
server_name 192.168.149.132;
#访问日志文件存放路径
access_log logs/server2.access.log combined;
location /
{
#默认首页文件,从左到右
index index.html index.htm;
#HTML网页存放目录
root /data0/htdocs/server2;
}
}
}
http
{
#第三个虚拟主机
server
{
#监听的IP和端口
listen 192.168.149.232:80;
#主机名称
server_name 192.168.149.232;
#访问日志文件存放路径
access_log logs/server3.access.log combined;
location /
{
#默认首页文件,从左到右
index index.html index.htm;
#HTML网页存放目录
root /data0/htdocs/server3;
}
}
}
---------------------------------------------------------------------------
从上面配置可以看出,一段server{....}就是一个虚拟主机,如果配置多个虚拟主机建立多段server{....}配置即可,非常方便。监听端口也可以不写IP地址直写端口,把它配置成"listen 80",则表示监听该服务器上所有IP的80端口,可以通过server_name区分不同的虚拟主机。
II.配置基于域名的虚拟主机
基于域名的虚拟主机是最常见得一种虚拟主机。只需要配置你的DNS服务器,将每个主机名映射到正确的IP地址,然后配置Nginx服务器,令其识别不同主机名就可以了。共享IP地址,有效的解决了IP地址不足的问题。如果没有特殊要求必须基于IP虚拟主机,最好使用基于域名的虚拟主机。
配置三个虚拟主机,第一个aaa.domain.com:表示所有对aaa.domian.com的访问都由它来处理;第二个bbb.otherdomain.com:表示所有对bbb.otherdomain.com的访问都由它来处理;第三个www.domain.com、domain.com,以及除了aaa.domian.com之外的所有*.domian.com二级域名的访问都由它来处理。每个虚拟主机的网页文件分别存放在不同的目录中,每个虚拟主机使用了不同的日志文件来记录访问日志。
----------------------------------------------------------------------------
http
{
#第一个虚拟主机
server
{
#监听端口
linsten 80;
#主机名称
server_name aaa.domain.com;
#访问日志文件存放路径
access_log logs/aaa.domain.com.access.log combined;
location /
{
#默认首页文件,顺序从左到右
index index.html index.htm
#HTML网页文件存放的目录
root /data0/htdocs/aaa.domain.com;
}
}
}
http
{
#第二个虚拟主机
server
{
#监听端口
linsten 80;
#主机名称
server_name bbb.otherdomain.com;
#访问日志文件存放路径
access_log logs/bbb.otherdomain.com.access.log combined;
location /
{
#默认首页文件,顺序从左到右
index index.html index.htm
#HTML网页文件存放的目录
root /data0/htdocs/bbb.otherdomain.com;
}
}
}
http
{
#第三个虚拟主机
server
{
#监听端口
linsten 80;
#主机名称
server_name www.domain.com domain.com *.domian.com;
#访问日志文件存放路径
access_log logs/www.domain.com.access.log combined;
location /
{
#默认首页文件,顺序从左到右
index index.html index.htm
#HTML网页文件存放的目录
root /data0/htdocs/domain.com;
}
}
}
----------------------------------------------------------------------------------
3.Nginx的日志文件配置与切割
Nginx访问日志文件配置
与Nginx日志相关的指令主要有两个:
log_format用来设置日志的格式
access_log用来指定日志文件的存放路径、格式和缓存大小。
两条指令在Nginx配置文件中的位置可以在http{....}之间,也可以在虚拟主机之间,即server{....}两个大括号之间。
I.log_format
语法格式:log_format name format [format ...]
其中name表示定义的格式名称,format表示定义的格式样式。
log_format有一个默认的、无须设置的combined日志格式设置,相当于Apache的combined日志格式:
log_format combined ‘$remote_addr - $remote_user [$time_local] ‘
‘"$request" $status $body_bytes_sent ‘
‘"$http_referer" "$http_user_agent"‘;
也可以自定义日志记录格式,注意:log_format指令设置的name名称在Nginx配置文件中不能重复。
Nginx服务器作为Web服务器,位于负载均衡设备、Squid、Nginx反向代理之后,就不能获取到客户端的真实IP地址了。原因是经过反向代理后,由于在客户端和Web服务器之间增加了中间层,因此Web服务器无法直接拿到客户端IP,通过$remote_addr变量拿到的是反向代理服务器的IP地址。但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
log_format combined ‘$http_x_forwarded_for - $remote_user [$time_local] ‘
‘"$request" $status $body_bytes_sent ‘
‘"$http_referer" "$http_user_agent"‘;
II.access_log
语法格式:access_log path [format [buffer=size | off]]
其中path表示日志文件的存放路径,format表示使用log_format指令设置日志格式的名称,buffer=size表示设置内存缓冲区的大小
①不想记录日子:access_log off;
②默认combined格式日志记录:access_log /data1/logs/filename.log;
或者access_log /data1/logs/filename.log combined;
③自定义日志格式:
log_format mylogformat ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘ $status $body_bytes_sent "$http_referer" ‘
‘ "$http_user_agent" $http_x_forwarded_for ‘;
access_log /data1/logs/access.log mylogformat buffer=32k;
④Nginx 0.7.4之后版本,access_log指令中日志文件路径可以包含变量:
access_log /data1/logs/$server_name.log combined;
存在变量的限制:
a. Nginx进程设置的用户和组必须有对该路径创建文件的权限
b. 缓冲将不会被使用
c. 对于每一条日志记录,日志文件都将先打开文件,再写入日志记录,然后马上关闭。
III. Nginx日志文件的切割
Nginx不支持像Apache一样使用cronolog来轮转日志,但是可以采用以下方式:
#mv /data1/logs/access.log /data1/logs/20160715.log
#kill -USR1 Nginx 主进程号
首先通过mv重名命日志文件,然后发送kill -USR1信号给Nginx进程号,让Nginx重新生成一个新的日志文件/data1/logs/access.log
如果想每天切割日志,还须要借助crontab。写一份按天切割的日志,按年、月份目录存放日志的shell脚本
------------------------------------------------------------------------
vim /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
=====================================================
#!/bin/bash
#这个脚本必须每天的00:00运行
#Nginx日志文件的存放路径
logs_path="/data1/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access_$(date -d "yesterday" + "%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
=====================================================
配置crontab每天凌晨00:00定时执行这个脚本:
crontab -e
00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
-----------------------------------------------------------------------------------