轻量级WEB服务器Nginx介绍
本文目录
第1 章 Nginx 简介 ............................................................................................................................. 2
第1.1 节 WEB服务器简介 ........................................................................................................... 2
第1.2 节 几个常用WEB服务器简介 .......................................................................................... 2
第1.2.1节Apache服务器 .........................................................................................................2
第1.2.2节Lighttpd 服务器 .......................................................................................................3
第1.2.3节Tomcat服务器 .........................................................................................................3
第1.2.4节IBM WebSphere .......................................................................................................3
第1.2.5节Windows IIS .............................................................................................................4
第1.2.6节Nginx的历史 ...........................................................................................................4
第1.3 节 为什么要用Nginx .......................................................................................................... 5
第1.4 节 获取Nginx .................................................................................................................... 6
第1.5 节 课后练习..........................................................................................................................6
第2 章 Nginx的安装和启动 ............................................................................................................. 7
第2.1 节 Nginx的安装 ..................................................................................................................7
第2.2 节 2.2 Nginx的启动、重启与停止 ...................................................................................8
第2.3 节 课后练习........................................................................................................................14
第3 章 Nginx的基本配置 ................................................................................................................16
第3.1 节 Nginx主配置概述 ........................................................................................................ 16
第3.2 节 Nginx下的虚拟主机配置 ............................................................................................23
第3.3 节 安全的连接https .......................................................................................................... 26
第3.4 节 Nginx日志管理 ............................................................................................................27
第3.5 节 访问控制 ...................................................................................................................... 29
第3.6 节 课后练习........................................................................................................................30
第4 章 Rewrite 规则 .........................................................................................................................32
第4.1 节 什么是Rewrite ..............................................................................................................32
第4.2 节 Rewrite相关指令 ......................................................................................................... 32
第4.3 节 课后练习........................................................................................................................36
第5 章 Nginx反向代理.....................................................................................................................38
第5.1 节 反向代理及其特点........................................................................................................38
第5.2 节 Nginx反向代理.............................................................................................................38
第5.3 节 Nginx反向代理配置....................................................................................................40
I
第5.4 节 课后练习........................................................................................................................45
第6 章 源代码搭建LNMP ...............................................................................................................47
第6.1 节 安装rpm 包 ...................................................................................................................47
第6.2 节 安装Nginx ....................................................................................................................48
第6.3 节 编译安装Mysql ............................................................................................................49
第6.4 节 编译安装php ................................................................................................................50
第6.5 节 安装php扩展模块工具 ...............................................................................................55
第6.6 节 使PHP扩展生效...........................................................................................................58
第6.7 节 整合Nginx与php ........................................................................................................ 60
第6.8 节 启动Nginx 服务 ...........................................................................................................65
第6.9 节 课后练习........................................................................................................................66
第7 章 课后练习参考答案............................................................................................................... 67
II
前言
前言
欢迎大家来到尚观学习Linux课程,希望大家通过在这学习,获取到扎实有用的知
识,为将来的锦绣前程铺平道路,祝大家在这度过艰苦而快乐的4个月。正如我常说的“辛
苦4个月,幸福后半生。”
本文档共分7章,深入浅出的介绍了当前主流的轻量级WEB服务器Nginx,带领大
家一步一步了解Nginx,并对它做相应的安装,配置,管理,调优。需要注意的是,本书默
认你是一名具有 Linux 操作基础的读者,因此当涉及到一些 Linux 操作的知识的时候,本文
档不会做过多讲解。当你学习完本文档内容后,你将会有能力去搭建一个高效、稳定、功能
丰富的WEB 服务器。
然而,学如行舟,不进则退。做为一个学者,我们应该不断的探索,大家在学完后仍应
该继续深入研究,让自己站的更高,才能够看的更远。
好了,接下来请跟随我一起进入Nginx的世界吧。
1
第1 章 Nginx 简介
第1章 Nginx 简介
第1.1节 WEB服务器简介
WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信
息浏览服务。Web已经成为很多人在网上查找、浏览信息的主要手段。成千上万的用户通
过简单的图形界面就可以访问各个大学、组织、公司等的最新信息和各种服务。商业界很快
看到了其价值,许多公司建立了主页,利用Web在网上发布消息,并将它作为各种服务的
界面,如客户服务、特定产品和服务的详细说明、宣传广千以及是渐增长的产品销售和服务。
商业用途促进了网络的迅速发展。如果你想通过主页向世界介绍自己或自己的公司,就必须
将主页放在一个WEB服务器上,当然你可以使用一些免费的主页空间来发布。但是如果你
有条件,你可以注册一个域名,申请一个IP地址,然后让你的ISP将这个IP地址解析到你
的 LINUX主机上。然后,在LINUX主机上架设一个WEB服务器。你就可以将主页存
放在这个自己的WEB服务器上,通过它把自己的主页向外发布。
第1.2节 几个常用WEB服务器简介
Unix和Linux平台下的常用Web服务器有Apache、 Nginx、 Lighttpd、
Tomcat、 IBM WebSphere等。其中目前应用最广泛的Web服务器是Apache。
Windows平台下最常用的服务器则是微软公司的IIS(Internet Information Server)。
第1.2.1节Apache 服务器
Apache 起初由 Illinois 大学 Urbana-Champaign 的国家高级计算程序中心开发。此
后Apache 被开放源代码团体的成员不断的发展和加强。1996年4月以来,Apache一直
是Internet上最流行的HTTP服务器,1999年5月它在 57% 的网页服务器上运行,到了
2005年7月这个比例上升到69%。Apache是目前世界上用的最多的Web服务器,它有
优势主要在于源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所
有的Unix、Linux、Windows系统平台之上)。Apache的模块支持非常丰富,以至于它提
2
第1 章 Nginx 简介
供了非常完善的功能。
Apache的官方网站: http://www.apache.org
第1.2.2节Lighttpd 服务器
Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网
站,安全、快速、兼容性好并且灵活的Web server环境。具有非常低的内存开销,cpu
占用率低,效能好,以及丰富的模块等特点。Lighttpd是众多OpenSource轻量级的Web
server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL
重写, Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在
Lighttpd 上很多功能都有相应的实现了,这点对于Apache的用户是非常重要的,因为迁
移到Lighttpd就必须面对这些问题。
Lighttpd的官方网站: http://www.lighttpd.net
第1.2.3节Tomcat 服务器
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一
个核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与
和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat即是一个Jsp和
Servlet的运行平台。同时Tomcat又不仅仅是一个Servlet容器,它也具有传统的Web服
务器的功能:处理Html页面,但是与Apache相比,它的处理静态Html的能力就不如
Apache,我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而
Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。
Tomcat的官方网站: http://tomcat.apache.org
第1.2.4节IBM WebSphere
WebSphere Application Server 是 一 种功能完善、开放的Web应用程序服务器,是
IBM电子商务计划的核心部分。基于Java和Servlets的Web应用程序运行环境,包含了
3
第1 章 Nginx 简介
为Web站点提供服务所需的一切,运 行 时 可 以 协 同 并 扩 展Apache、Netscape、 IIS
和IBM 的HTTPWeb服务器,因此可以成为强大的Web应用服务器。
WebSphere的官方网站: http://www.ibm.com
第1.2.5节Windows IIS
IIS 是Internet Information Server的缩写,它是微软公司主推的服务器。IIS与
Window NT Server完全集成在一起,因而用户能够利用Windows NT Server和
NTFS(NT File System,NT的文件系统)内置的安全特性,建立强大,灵活而安全的
Internet和Intranet站点。 IIS支持HTTP(Hypertext Transfer Protocol,超文本传输协
议),FTP(File Transfer Protocol,文件传输协议)以及SMTP协议,通过使用CGI和
ISAPI,IIS可以得到高度的扩展。
IIS的官方网站: http://www.iis.net
第1.2.6节Nginx 的历史
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine
X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理
服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,
它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。
自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系
统资源的消耗而闻名。
在俄罗斯许多大网站都已经使用它, 且一直表现不凡。截至2007年4月,俄罗斯大约
有20%左右的虚拟主机是由nignx服务或代理的。Google在线安全博客中统计Nginx服
务或代理了大约所有Internet虚拟主机的4%。而Netcraft的统计显示,Nginx服务的主
机在过去的一年里以四倍的速度增长并且在这几年里,它的排名还在不断上升,下图为
Netcraft截止至2010年5月的统计。
4
第1 章 Nginx 简介
第1.3节 为什么要用Nginx
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内
核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起
慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器。例
如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采
取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持
10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说
5
第1 章 Nginx 简介
基本上是毫无用处的。就稳定性而言,nginx比lighttpd更胜一筹。
Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运
行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁
盘I/O的阻塞延迟。
Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易。
Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),acceptfilter(
FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性
能。
当然,nginx还很年轻,多多少少存在一些问题,比如:Nginx是俄罗斯人创建,目前
文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.尽管Nignx
的模块比较多,但它们还不够完善。对脚本的支持力度不够。
这些问题,Nginx的作者和社区都在努力解决,我们有理由相信nginx将继续以高速
的增长率来分享轻量级HTTP服务器市场,会有一个更美好的未来。
第1.4节 获取Nginx
你可以从Nginx的官方主页上下载到Nginx的各个版本 http://nginx.net
其中最新版本为Nginx的开发版本,之前的版本为当前稳定版本。例如最新版本为
0.8.X,则当前稳定版本为0.7.X。你还可以在官方http://nginx.org/en/docs找到一些帮助
文档,另外http://wiki.nginx.org也是一个不错的选择。
第1.5节 课后练习
1. 简述常见市场常见WEB服务器及他们的区别。
2. 简述Nginx的优点。
3. 从官方下载Nginx源代码。
6
第2 章 Nginx 的安装和启动
第2章 Nginx的安装和启动
第2.1节 Nginx的安装
Linux下安装一个软件有三种方式,这边我们以源代码编译安装为主。
首先你需要从官方下载适合你的Nginx版本,http://nginx.org/en/download.html。
本书将以Nginx 7.67 为例讲解。
安装之前请你将你原来的httpd服务停止并卸载
[root@example tmp]# service httpd stop
[root@example tmp]# rpm -e httpd --nodeps
出于管理和安全的目的考虑,也许你希望使用一个指定的普通用户身份去运行你的web
服务器,所以我们首先会添加一个普通用户帐号用于运行我们的Nginx
[root@example ~]# groupadd nginx
[root@example ~]# useradd nginx
然后解压并编译安装你的Nginx
[root@example tmp]# tar xf nginx-0.8.46.tar.gz
[root@example tmp]# cd nginx-0.8.46
[root@example nginx-0.8.46]#./configure --user=nginx --group=nginx
--prefix=/usr/local/nginx/ --with-http_stub_status_module --with-http_ssl_module
[root@example nginx-0.8.46]#make
[root@example nginx-0.8.46]#make install
安装过程还是比较简单的,./configure过程可能会报一依赖关系,请自行解决依赖关
系。下面我们来看看./configure后面几个常用参数
7
第2 章 Nginx的安装和启动
--prefix=<dir> 指定安装主目录,默认为/usr/local/nginx
--user=<user> 指定用户身份,如果没有指定则默认使用nobody
--group=<group> 指定组身份
--with-http_ssl_module 启用https支持
更的多参数请参考./configure --help
第2.2节 2.2 Nginx的启动、重启与停止
安装完后我们现在可以启动Nginx了,我们可以进入到Nginx 的主目录
[root@example nginx-0.7.67]# /usr/local/nginx/sbin/nginx -c
/usr/local/nginx/conf/nginx.conf
-c 是用来指定Nginx的主配置文件,如果没有指定则默认为
/usr/local/nginx/conf/nginx.conf
启动后可以使用ps和netstat命令来查看是否启动成功
[root@example nginx-0.8.46]# ps -ef | grep nginx
root 2187 1 0 14:33 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 2194 2187 0 14:34 ? 00:00:00 nginx: worker process
root 2197 2508 0 14:34 pts/0 00:00:00 grep nginx
[root@example nginx-0.8.46]# netstat -ntlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2187/nginx
然后我们来测试一下主页是否可以访问
[root@example ~]# links 127.0.0.1
8
第2 章 Nginx 的安装和启动
如果显示Welcome to nginx! 则说明服务正常
Nginx并没有为我们提供类似System V服务的管理脚本,所以如果你希望它在开机的
时候Nginx可以自动启动,可以执行以下命令 。
[root@example ~]# echo “/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
” >> /etc/rc.local
当然,如果你对System V的服务管理脚本情有独钟的话,可以参考如下脚本
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
9
第2 章 Nginx的安装和启动
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
10
第2 章 Nginx 的安装和启动
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
killall -9 nginx
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
11
第2 章 Nginx的安装和启动
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
12
第2 章 Nginx 的安装和启动
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
13
第2 章 Nginx的安装和启动
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|
configtest}"
exit 2
esac
脚本生成完了不要忘了给一个执行权限,然后使用chkconfig命令对其进行管理
[root@example ~]# cp nginx /etc/init.d/
[root@example ~]# chmod 755 /etc/init.d/nginx
[root@example ~]# chkconfig --add nginx
当我们对Nginx的配置文件做过一些更改后,希望在不中断当前服务的情况下,进行
一个平滑的重启,可以使用如下命令。
[root@example ~]# service nginx reload
脚本中的reload函数会首先对配置文件做一个语法格式的检查,使用的是如下的命令
[root@example init.d]# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
当语法格式检查通过后,会对Nginx发出一个标记为1或者说是HUP的信号源,
Nginx收到后会关闭旧进程,打开新进程,如果有进程正在为一个用户提供服务,则会等待
这次服务结束。
当然我们也可以使用service nginx restart的方式去重启服务。它会先尝试以比较温柔
的方式去结束进程,如果有进程没有被结束掉,那么killall -9 nginx。
关于停止Nginx,直接service nginx stop 即可,或者kill死所有的Nginx 进程。
第2.3节 课后练习
1. 源代码编译Nginx。能够自行搭建Nginx环境。
从服务器上下载源代码。
14
第2 章 Nginx 的安装和启动
解压并进行编译安装
启动Nginx服务并测试
2. 创建Nginx服务管理脚本。能够使用脚本简化Nginx服务管理。
在/etc/init.d/目录下创建Nginx服务脚本
修改权限
加入chkconfig 管理列表
使用service 命令进行重启测试
15
第3 章 Nginx的基本配置
第3章 Nginx的基本配置
第3.1节 Nginx主配置概述
Linux下基本上每个服务都会有它的主配置文件,该文件会定义服务应该如果去运行,
使用些什么参数,启用些什么功能,相关会涉及到的一些操作文件在哪,所以主配置文件对
服务是至关重要的。下面我们来分析一下Nginx 的主配置文件。
Nginx的主配置文件默认情况下位于/usr/local/nginx/conf/nginx.conf 以下为Nginx
配置文件一些参数的注释。
#user nobody;
#指定使用的用户
worker_processes 1;
#开启的进程数,一般设置1-5
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#定义错误日志,以及记录的日志等级
#pid logs/nginx.pid;
#定义pid文件位置
events {
16
第3 章 Nginx 的基本配置
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#use epoll; #使用epoll(linux2.6的高性能方式)
#Nginx支持如下处理连接的方法(I/O复用方法),这些方法可以通过use指令指定。
#select - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参
数 –with-select_module 和 –without-select_module 来启用或禁用这个模块。
#poll - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数
–with-poll_module 和 –without-poll_module 来启用或禁用这个模块。
#kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双
处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
#epoll - 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2,
有让2.4版本的内核支持epoll的补丁。
#rtsig - 可执行的实时信号,使用于Linux内核版本2.2.19以后的系统。可是从Linux内核版本
2.6.6-mm2开始,这个参数就不再使用了.
#/dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和
Tru64 UNIX 5.1A+.
#eventport - 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安
全补丁。
worker_connections 1024;
#worker_connections 51200; #每个进程最大连接数(最大连接=连接数x进程数)
}
http {
include mime.types;
#文件扩展名与文件类型映射表
default_type application/octet-stream;
#默认文件类型
17
第3 章 Nginx的基本配置
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#开启高效文件传输模式
#tcp_nopush on;
#该选项用于防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65;
##长链接超时时间
#gzip on;
#打开gzip压缩
#fastcgi_connect_timeout 300;
#fastcgi_send_timeout 300;
#fastcgi_read_timeout 300;
#fastcgi_buffer_size 128k;
#fastcgi_buffers 4 256k;
#fastcgi_busy_buffers_size 256k;
#fastcgi_temp_file_write_size 256k;
18
第3 章 Nginx 的基本配置
#fastcgi_temp_path /dev/shm;
#fastcgi连接超时时间和缓存
server {
listen 80;
server_name localhost;
#主机名
#charset koi8-r;
#默认字符编码 charset gb2312
#access_log logs/host.access.log main;
location / {
#pass路径匹配 能够匹配路径中带“/”的 不过需要注意的是如果之后也有相关“/”匹配项并且
使用比此处更精确匹配符,则以之后表达式优先
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
19
第3 章 Nginx的基本配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
#精确的匹配,并且不再向下匹配
root html;
}
#
#location ~ \.php$ {
#正则表达式匹配 一旦匹配则不再向下匹配
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
#指定fastcgi的地址端口
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
20
第3 章 Nginx 的基本配置
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#不允许访问以.ht开头的文件
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
21
第3 章 Nginx的基本配置
#以上在配置虚拟主机
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
#以上为ssl 配置
# location / {
# root html;
# index index.html index.htm;
# }
#}
22
第3 章 Nginx 的基本配置
}
第3.2节 Nginx下的虚拟主机配置
利用虚拟主机技术,可以把一台真正的主机分成许多"虚拟"的主机,每一台虚拟主机都
具有独立的域名和IP地址,具有完整的Internet服务器(www, FTP,email)功能。 虚拟
主机之间完全独立,在外界看来,每一台虚拟主机和一台独立的主机完全一样。效果一样但
费用却大不一样了。由于多台 虚拟主机 共享一台真实主机的资源,每个 虚拟主机用户承受
的硬件费用、网络维护费用、通信线路的费用均大幅度降低,Internet真正成为人人用得起
的网络!
虚拟主机共分为三种:基于IP的虚拟主机,基于端口的虚拟主机和基于名称的虚拟主
机。前两种由于受到成本和客户使用习惯的限制,相对使用的没有基于名称的虚拟主机多,
以下我们介绍一下三种虚拟主机的配置。
Nginx基于名称的虚拟主机配置:
server {
listen 80;
server_name www.example.com;
...
}
server {
listen 80;
server_name www.test.com;
...
}
23
第3 章 Nginx的基本配置
server {
listen 80 default;
...
}
上述配置中, 定义了三个虚拟主机。前两个server, 通过域名
“www.example.com” 和 “www.test.com” 可以分别访问正确的网站。如果浏览器直接
通过IP地址或者其他指向这台机器的域名访问, 那么访问到的是第三个server配置。第三
个server为一个默认配置, 请注意它没有“server_name”指令, 并且“listen”指令包含
一个“default”关键字。
Nginx基于IP的虚拟主机
[root@server nginx]# vi /usr/local/nginx/conf/nginx.conf
server {
listen 10.0.0.88:80;
root 88.com;
index index.html;
}
server {
listen 10.0.0.87:80;
root 87.com;
index index.html;
}
[root@server nginx]# ifconfig eth0:0 10.0.0.88
[root@server nginx]# ifconfig eth0:1 10.0.0.87
24
第3 章 Nginx 的基本配置
[root@server nginx]# mkdir /usr/local/nginx/88.com
[root@server nginx]# echo 'I am your father' > /usr/local/nginx/88.com/index.html
[root@server nginx]# mkdir /usr/local/nginx/87.com
[root@server nginx]# echo 'this is 87.com' > /usr/local/nginx/87.com/index.html
以上配置了两台虚拟主机,一台IP为10.0.0.88,另一台为10.0.0.87。它们都监听80
端口。根据访问的IP地址不同,返回不同网站内容。
Nginx基于端口的虚拟主机
[root@server nginx]# vi /usr/local/nginx/conf/nginx.conf
server {
listen 80;
root 80.com;
}
server {
listen 8080;
root 8080.com;
}
[root@server nginx]# mkdir /usr/local/nginx/80.com
[root@server nginx]# mkdir /usr/local/nginx/8080.com
[root@server nginx]# echo 'this is 80.com' > /usr/local/nginx/80.com/index.html
[root@server nginx]# echo 'this is 8080.com' > /usr/local/nginx/8080.com/index.html
以上配置了两台虚拟主机,一台使用相同IP。一台使用80端口,另一台使用8080端
口。访问8080端口时需要在URL后加上 :8080 。
25
第3 章 Nginx的基本配置
第3.3节 安全的连接https
众所周知,我们在互联网上冲浪,一般都是使用的http协议(超文本传输协议),默
认情况下数据是明文传送的,这些数据在传输过程中都可能会被捕获和窃听,因此是不安全
的。https可以说是http协议的安全版,就是为了满足对安全性要求比较高的用户而设计的。
如果您的邮件中有敏感数据,不希望被人窃听;如果您不希望被钓鱼网站盗用帐号信息,
如果您希望您在使用邮箱的过程中更安全,那么我们推荐您使用https 安全连接。
Nginx的https配置方法:
首先生成一对证书。
你需要使用到openssl命令,所以请确认系统已经安装过此包
RHEL5中在/etc/pki/tls/certs 目录有个脚本可以帮助我们简化证书生成的过程,所以
我们首先切换到此目录
[root@example ~]# cd /etc/pki/tls/certs
[root@example certs]# cd /etc/pki/tls/certs
[root@example certs]# make server.key
生成私钥
[root@example certs]# openssl rsa -in server.key -out server.key
去除密码以便使用时不询问密码
[root@example certs]# make server.csr
生成证书颁发机构,用于颂发公钥
[root@example certs]# openssl x509 -in server.csr -req -signkey server.key -days 365 -out
server.crt
颁发公钥,不过由于我们并不是去CA证书中心申请的公钥,所以在使用的时候,客户
端浏览器会跳出未受信任的警告。如果你money够多,请去CA申请。
26
第3 章 Nginx 的基本配置
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key;
#以上两句在指定证书所存放的路径
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#指出允许的密码,密码指定为OpenSSL支持的格式
ssl_prefer_server_ciphers on;
#依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
...
}
第3.4节 Nginx日志管理
做为一个优秀的管理员,应该能够对你所维护的服务器了如指掌,那么日志的阅读就是
必不可少的,我们可以通过日志,了解到你的服务器是否正常运行,有谁在访问你的服务器,
每天的访问量是多少,有没有非法的不受欢迎的访问等等。
在Nginx主配置中有关Nginx日志的相关参数主要有两条。
log_format 指定日志格式
access_log 指定日志存放路径
27
第3 章 Nginx的基本配置
对于一个日均PV数十万以上的网站来说,日志的增长将会很迅速,一天的日志几个G
属于正常情况。所以为了我们单个日志文件不至于太大,我们需要定期的去截断我们的日志。
不可很可惜,Nginx默认并不支持我们所熟悉的cronolog方式来对每天的日志进行截断,
那么我们可以通过以下方法来解决。
[root@example ~]# mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log1
[root@example ~]# touch /usr/local/nginx/logs/access.log
[root@example ~]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
然后以crond的方式或者logrotate的方式运行。
对于习惯使用cronolog来做日志分割的管理员来说,无法使用cronolog总会成为他心
里挥之不去的痛。然而有时候事情总会很奇妙,只要你想去解决,就一定有办法解决。我在
这里介绍一种通过管道符文件另僻溪径的方法使用cronolog。
首先下载并编译安装我们cronolog
[root@example ~]# tar xf cronolog-1.6.2.tar.gz
[root@example ~]# ./configure
[root@example ~]# make && make install
[root@example ~]# service nginx stop
[root@example ~]# mv /usr/local/nginx/logs/access.log
/usr/local/nginx/logs/access.log.bak
[root@example ~]# mkfifo /usr/local/nginx/logs/access.log
[root@example ~]# cronolog /usr/local/nginx/logs/access.log.%Y%m%d <
/usr/local/nginx/logs/access.log &
[root@example ~]# service nginx start
访问一下自己的主机,然后查看/usr/local/nginx/logs/目录下是否多出个access.log.
%Y%m%d 文件,查看一下这个文件里的内容是否是我们的访问日志。
28
第3 章 Nginx 的基本配置
这里需要注意的是必需在Nginx启动之前执行cronolog命令,否则Nginx将无法正
常启动。
对于一些你不需要记录的日志内容,我们可以使用以下方式关闭对这些文件的日志记录。
location ~ .*\.( js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
access_log off;
}
第3.5节 访问控制
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不
希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份
认证,就如给你自己的家门加一把锁,以拒绝那些不速之客。我们在服务课程中学习过
apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似。
location / {
root html;
index index.html index.htm;
auth_basic "xxxx";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
设置密码
[root@example nginx]# htpasswd -c /usr/local/nginx/passwd.db mark
New password: (输入密码)
29
第3 章 Nginx的基本配置
Re-type new password: (again)
Adding password for user mark
然后访问一下页面测试一下。
另外如果你想阻止别人访问你某些目录下的特定文件,比如我网站主目录下有个test目
录,我不想让别人访问我test目录下的”.txt”和”.doc”的文件,那么我们可以通过deny
的方式来做拒绝。
location ~* \.(txt|doc)$ {
root html/test;
deny all;
}
此处 ~* 代表不区分大小写方式匹配。
第3.6节 课后练习
1. 配置两个基于名称的虚拟主机 www.test.com 和 www.example.com (注意,
做此实验之前你应该已经有正确的DNS配置)。
修改Nginx主配置文件,增加两个server 字段。
创建相关网站主目录并重启Nginx服务。
2. 配置一个https。以使你的服务器可以提供一个安全的连接。
生成安全密钥。
修改Nginx主配置文件,加入ssl相关配置
重启Nginx服务。
3. 配置你的虚拟主机(www.test.com),当别人试图访问时,要求进行身份认证,
允许mark用户可以通过密码uplooking进行访问。
修改Nginx主配置文件,加入auth相关配置。
30
第3 章 Nginx 的基本配置
创建认证使用密码文件
重启Nginx服务。
31
第4 章 Rewrite 规则
第4章 Rewrite 规则
第4.1节 什么是Rewrite
Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他
URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页
面方式的一种技术。比如http://www.123.com/news/index.asp?id=123 使用
URLRewrite 转换后可以显示为 http://www.123.com/news/123.html
对于追求完美主义的网站设计师,就算是网页的地址也希望看起来尽量简洁明快。形如
http://www.123.com/news/index.asp?id=123的网页地址,自然是毫无美感可言,而用
UrlRewrite技术,你可以轻松把它显示为 http://www.123.com/news/123.html。
理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于
动态页面。所以,UrlRewrite可以让我们网站的网页更容易被搜索引擎所收录。
从安全角度上讲,如果在url中暴露太多的参数,无疑会造成一定量的信息泄漏,可能
会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的url地址可以给我们带来更
高的安全性。
第4.2节 Rewrite相关指令
Nginx Rewrite相关指令有if、rewrite、set、return等。
if 的语法 应用于 server和location环境内
if (condition) { … }
if可以支持如下条件判断匹配符号
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
32
第4 章 Rewrite 规则
-f 和!-f 用来判断是否存在文件
-d 和!-d 用来判断是否存在目录
-e 和!-e 用来判断是否存在文件或目录
-x 和!-x 用来判断文件是否可执行
在匹配过程中可以引用一些Nginx的全局变量,更多的变量请参考
http://wiki.nginx.org/NginxHttpCoreModule 的 Variables 部分
$args, 请求中的参数;
$document_root, 针对当前请求的根路径设置值;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用
以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$document_uri 与$uri一样,URI地址;
$server_port, 请求到达的服务器端口号;
33
第4 章 Rewrite 规则
看了一大堆也许会有点晕,当然有时晕着晕着也就习惯了。不过我们还是先来看两个例
子。这样更有助于理解。
例4-1 匹配访问的url地址是否是个目录
if (-d $request_filename) {
…;
}
例4-2 匹配访问的地址是否以www开头
if ($hosts ~* ^www) {
…;
}
rewrite 指令根据表达式来重定向URI,或者修改字符串。可以应用于server,
location, if环境下 每行rewrite指令最后应该根一个flag标记,支持的flag标记有
last 相当于Apache里的[L]标记,表示完成rewrite
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器地址会显示跳转后URL地址
last和break标记的区别在于,last标记在本条rewrite规则执行完后,会对其所在的
server { … } 标签重新发起请求,而break标记则在本条规则匹配完成后,停止匹配,不
再做后续的匹配。另有些时候必须使用last,比如在使用alias指令时,而使用proxy_pass
指令时则必须使用break。
例4-3:以下这段rewrite会导致死循环
location /abc/ {
34
第4 章 Rewrite 规则
rewrite “^/abc/(.*)\.html$” /abc/index.html last;
}
我们应该将上面的last改成break以避免死循环。
redirect 和 permanent区别则是返回的不同方式的重定向,对于客户端来说一般状态
下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,如果我们把一个地址
采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎
索引库中彻底废弃掉原先的老地址。
使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,
然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有
可能出现URL劫持的现像。
我们在做URI重写时,有时会发现URI中含有相关参数,如果需要将这些参数保存下
来,并且在重写过程中重新引用,我们可以用到 () 和 $N 的方式来解决。
例4-4:匹配访问的url地址是否是个目录,如果是则自动加个 /
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
例4-5:用户访问的网址为www.test.com/abc.html 重写后真实地址是
www.test.com/login.php?user=abc
location ~* /php/.*\.html$ {
rewrite /php/(.*)\.html /login.php?user=$1 last;
}
例4-6:用户访问地址为/uplook/11-22-33.html重写后真实地址为
/uplook/11/22/33.html
location /uplook/ {
35
第4 章 Rewrite 规则
rewrite /uplook/([0-9]+)-([0-9]+)-([0-9]+).html /uplook/$1/$2/$3.html last;
}
set 指令是用于定义一个变量,并且赋值。应用于server,location,if环境。
语法格式为: set $变量名 变量值
例4-7:当访问任意目录下的whoami.html 都重定向到 /who.html
location ~* .*/whoami\.html$ {
set $who 'who.html';
rewrite .* /$who break;
}
return 指令用于返回状态码给客户端,应用于server,location,if环境。
例4-8:如果访问的 .sh 结尾的文件则返回403操作拒绝错误
location ~* .*\.sh$ {
return 403;
}
第4.3节 课后练习
1. 配置虚拟主机*.test.com 。当客户端访问任意 XXX.test.com时都能匹配此主机并将
地址重写成 www.test.com/XXX/ (注意,实验之前你应该保证 XXX.test.com都
能正常解析)
修改主配置文件,配置虚拟主机 *.test.com
书写if语句,判断如果以test.com结尾的由进行url重写
将 test.com 之前的内容保存于一个变量domain中
36
第4 章 Rewrite 规则
将原地址重写成 www.test.com/$domain/
2. 当用户访问服务器 http://www.test.com/page-uid-123.html 时服务器自动将
地址重写成 http://www.test.com/page.php?uid=123,当访问
http://www.test.com/page-username-123.html重写成 http://www.test.com/page.php?
username=123 。其中123.html可能是任意文件名 XXX.html
配置主配置文件并书写rewrite规则
使用location语句。
在Rewrite中将username和uid字段保存下来,并以变量$1方式引用。
将XXX.html字段保存下来,并以变量$2方式引用。
3. 当用户访问服务器 http://www.test.com/today-pic-112.html 时服务器自动将
地址重写成 http://www.test.com/today/pic/112.html。(注意,此处today pic 可以更换
成其他任意字母,112可以更换成其他任意数字)
配置主配置文件并书写rewrite规则
配置以html结尾的文件做rewrite
将today pic 112 字段分别保存下来并以$1 $2 $3方式引用
37
第5 章 Nginx反向代理
第5章 Nginx反向代理
第5.1节 反向代理及其特点
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然
后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连
接的 客户端,此时代理服务器对外就表现为一个服务器。
反向代理又称为Web服务器加速,是针对Web服务器提供加速功能的。它作为代理
Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名
称的由来)。代理服务器可以缓存一些web的页面,降低了web服务器的访问量,所以可
以降低web服务器的负载。web服务器同时处理的请求数少了,响应时间自然就快了。同
时代理服务器也存了一些页面,可以直接返回给客户端,加速客户端浏览。实施反向代理,
只要将反向代理设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个
WEB服务器时,通过DNS服务器解析后的IP地址是代理服务器的IP地址,而非原始Web
服务器的IP地址,这时代理服务器设备充当Web服务器,浏览器可以与它连接,无需再直
接与Web服务器相连。因此,大量Web服务工作量被转载到反向代理服务上。不但能够很
大程度上减轻web服务器的负担,提高访问速度,而且能够防止外部网主机直接和web服
务器直接通信带来的安全隐患。
第5.2节 Nginx反向代理
Nginx proxy是Nginx的王牌功能,利用proxy基本可以实现一个完整的7层负载均
衡,它有这 些特色:
1. 功能强大,性能卓越,运行稳定。
2. 配置简单灵活。
3. 能够自动剔除工作不正常的后端服务器。
4. 上传文件使用异步模式。
38
第5 章 Nginx反向代理
5. 支持多种分配策略,可以分配权重,分配方式灵活。
在nginx的反向代理优点介绍中,提到了异步传输模式 下面就来讲解下传统的代理
(apache/squid)的同步传输和nginx的异步传输的差异。
看图:
squid同步传输:浏览器发起请求,而后请求会立刻被转到后台,于是在浏览器和后台
之间就建立了一个通道。在请求发起直到请求完成,这条通道都是一直存 在的。
nginx异步传输:浏览器发起请求,请求不会立刻转到后台,而是将请求数据
(header)先收到nginx上,然后nginx再把这个请求发到后端, 后端处理完之后把数据
返回到nginx上,nginx将数据流发到浏览器,这点和lighttpd有点不同,lighttpd是将后
端数据完全接收后才发 送到浏览器。
那么这到底有什么好处呢?
1) 假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才
能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连 接,半小时后
文件上传结束,由此可见,后台服务器连接保持了半个小时;而nginx异步代理就是先将此
文件收到nginx上,因此仅仅是nginx和用户 保持了半小时连接,后台服务器在这半小时
内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,
nginx和后台之间的带宽 是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可
39
第5 章 Nginx反向代理
见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,
可见优化 程度很大。
2) 在上面这个例子中,假如后台服务器因为种种原因重启了,上传文件就自然中断了,
这对用户来说是非常恼火的一件事情,想必各位也有上传文件传到一半被中断的 经历。用
nginx代理之后,后台服务器的重启对用户上传的影响减少到了极点,而nginx是非常稳定
的并不需要常去重启它,即使需要重启,利用kill -HUP就可以做到不间断重启nginx。
3) 异步传输可以令负载均衡器更有保障,为什么这么说呢?在其它的均衡器
(lvs/haproxy/apache等)里,每个请求都是只有一次机会的,假如用 户发起一个请求,
结果该请求分到的后台服务器刚好挂掉了,那么这个请求就失败了;而nginx因为是异步的,
所以这个请求可以重新发往下一个后台,下一个 后台返回了正常的数据,于是这个请求就
能成功了。还是用用户上传文件这个例子,假如不但用了nginx代理,而且用了负载均衡,
nginx把上传文件发往 其中一台后台,但这台服务器突然重启了,nginx收到错误后,会将
这个上传文件发到另一台后台,于是用户就不用再花半小时上传一遍。
4) 假如用户上传一个10GB大小的文件,而后台服务器没有考虑到这个情况,那么后
台服务器岂不要崩溃了。用nginx就可以把这些东西都拦在nginx上, 通过nginx的上传
文件大小限制功能来限制,另外nginx性能非常有保障,就放心的让互联网上那些另类的用
户和nginx对抗去吧。
第5.3节 Nginx反向代理配置
修改Nginx主配置文件,在http全局配置部分加入如下内容:
http {
… …
client_max_body_size 300m;
#允许客户端请求的最大单个文件字节数,它出现在请求头部的Content-Length字段。(可
以更改此参数达到限制用户上传文件大小的目的)
client_body_buffer_size 128k;
40
第5 章 Nginx反向代理
#这个指令可以指定连接请求使用的缓冲区大小,默认值:8k/16k 。如果客户端请求一个文
件大于128k,则Nginx会尝试在硬盘上创建临时文件。如果硬盘满了,则会报错。
client_body_temp_path /dev/shm/client_body_temp;
#这个指令指定连接请求试图写入缓存文件的目录路径。
proxy_connect_timeout 600;
#跟后端服务器连接的超时时间,发起握手等候响应超时时间
proxy_read_timeout 600;
#默认值:proxy_read_timeout 60。决定读取后端服务器应答的超时时间,它决定nginx将
等待多久时间来取得一个请求的应答。超时时间是指完成了两次握手后并且状态为established的超
时时间,而不是所有的应答时间。 相对于proxy_connect_timeout,这个时间可以扑捉到一台将你
的连接放入连接池延迟处理并且没有数据传送的服务器,注意不要将此值设置太低,某些情况下代理
服务器将花很长的时间来获得页面应答 。如果被代理服务器在设置的时间内没有传递数据,nginx
将关闭连接。
proxy_send_timeout 600;
#设置代理服务器转发请求的超时时间,同样指完成两次握手后的时间,如果超过这个时间代
理服务器没有数据转发到后端服务器,nginx将关闭连接。
proxy_buffer_size 16k;
#默认值:proxy_buffer_size 4k/8k 。设置从后端服务器读取的第一部分应答的缓冲区大小,
通常情况下这部分应答中包含一个小的应答头。
proxy_buffers 4 32k;
#设置用于读取应答(来自后端服务器)的缓冲区数目和大小,告诉Nginx保存单个用的几个
Buffer,最大用多大空间
proxy_busy_buffers_size 64k;
#如果系统很忙的时候可以申请更大的proxy_buffers,官方推荐*2
proxy_temp_file_write_size 64k;
#设置在写入proxy_temp_path时缓存临文件数据的大小,在预防一个工作进程在传递文件
时阻塞太长。
41
第5 章 Nginx反向代理
proxy_temp_path /dev/shm/proxy_temp;
#类似于http核心模块中的client_body_temp_path指令,指定一个目录来缓冲比较大的被
代理请求。
upstream server_pool {
server 192.168.0.88:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.0.89:80 weight=2 max_fails=2 fail_timeout=30s;
}
#HTTP负载均衡模块。upstream这个字段设置一群服务器,可以将这个字段放在
proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以是监听不同端口的服务器,并且
也可以是同时监听TCP和Unix socket的服务器。 服务器可以指定不同的权重,默认为1。
… …
}
修改Nginx主配置文件,在server中location / 配置部分做如下修改:
server {
… …
location / {
proxy_pass http://server_pool/;
#确定需要代理的URL,端口或socket。
proxy_redirect off;
#如果需要修改从后端服务器传来的应答头中的"Location"和"Refresh"字段,可以用这个指令
设置。
proxy_set_header X-Real-IP $remote_addr;
#这个指令允许将发送到后端服务器的请求头重新定义或者增加一些字段。 这个值可以是一个
文本,变量或者它们的组合。
42
第5 章 Nginx反向代理
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504 http_404;
#确定在何种情况下请求将转发到下一个服务器:
#error - 在连接到一个服务器,发送一个请求,或者读取应答时发生错误。
#timeout - 在连接到服务器,转发请求或者读取应答时发生超时。
#invalid_header - 服务器返回空的或者错误的应答。
#http_500 - 服务器返回500代码。
#http_502 - 服务器返回502代码。
#http_503 - 服务器返回503代码。
#http_504 - 服务器返回504代码。
#http_404 - 服务器返回404代码。
#off - 禁止转发请求到下一台服务器。
}
… …
}
Nginx的upstream目前支持5种方式的分配
1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自
动剔除。
2 weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
43
第5 章 Nginx反向代理
upstream bakend {
server 192.168.0.88 weight=10;
server 192.168.0.89 weight=10;
}
3 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以
解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.88:80;
server 192.168.0.89:80;
}
4 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
例如:
upstream bakend {
server 192.168.0.88:80;
server 192.168.0.89:80;
fair;
}
5 url_hash(第三方)
44
第5 章 Nginx反向代理
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务
器为缓存时比较有效。
例如:
upstream backend {
server 192.168.0.88:3128;
server 192.168.0.89:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
1. down 表示单前的server暂时不参与负载
2. weight 默认为1.weight越大,负载的权重就越大。
3. max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回
proxy_next_upstream 模块定义的错误
4. fail_timeout:max_fails次失败后,暂停的时间。
5. backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。
所以这台机器压力会最轻。
Nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
第5.4节 课后练习
1:配置Nginx做为前端反向代理(IP为192.168.0.188),将http请求以轮询的方
式转发至后端两台apache服务器(两台apache服务器IP分别为192.168.0.220
192.168.0.221)。
配置apache服务器
45
第5 章 Nginx反向代理
配置Nginx代理服务器
设置proxy相关参数
配置Nginx接收到客户请求后使用upstream地址池
46
第6 章 源代码搭建LNMP
第6章 源代码搭建LNMP
LNMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件:
Linux,操作系统; Nginx,网页服务器; MySQL,数据库管理系统(或者数据库服务
器); PHP 和有时 Perl 或 Python脚本语言。
在前期课程中大家已经接触过LAMP环境,它可以为我们提供一个功能强大的WEB
平台,但是由于Apache的已不能上远远低于Nginx,所以越来越多的企业从LAMP环境
迁移到LNMP环境下,以提供一个高性能的,多功能的WEB平台。
接着我们开始进入LNMP 搭建。
第6.1节 安装rpm包
首先安装如下rpm包,以满足LNMP环境需求。
libjpeg-devel
libpng-devel
libtiff-devel
fontconfig-devel
freetype-devel
libXpm-devel
gettext-devel
openssl-devel
libtool-ltdl-devel
libjpeg-devel ,libpng-devel ,libtiff-devel ,fontconfig-devel ,freetypedevel,
libXpm-devel这些都是图片与字体相关的开发包,为了使php可以对其做更好的
支持。gettext是语言相关的一个函数库。openssl-devel是一套工具,用于生成X.509协
议中所使用的密钥,公钥等文件。libtool是一个通用库支持脚本,在php编译过程中会需
47
第6 章 源代码搭建LNMP
要使用到。
第6.2节 安装Nginx
安装pcre,系统自带的pcre版本过低,不能满足我们的需求。 pcre是一个正则表达
式相关的包,要想Nginx使用Rewrite,那么就需要正则的支持。
[root@server lnmp]# tar xf pcre-8.10.tar.bz2
[root@server lnmp]# cd pcre-8.10
[root@server pcre-8.10]# ./configure
[root@server pcre-8.10]# make && make install
编译安装Nginx
[root@server lnmp]# useradd nginx
[root@server lnmp]# tar xf nginx-0.8.46.tar.gz
[root@server lnmp]# cd nginx-0.8.46
[root@server nginx-0.8.46]# ./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx/ \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-sha1=/usr/lib
[root@server nginx-0.8.46]# make && make install
我们使用--user与--group的参数指定Nginx运行时的所有者,以提高安全性。--
48
第6 章 源代码搭建LNMP
prefix指定了Nginx的安装位置。--with-http_stub_status_module可以让Nginx获取到
相关的工作状态,以便我们平时可以做更好的监控。 --with-http_ssl_module为启用ssl
的支持。--with-sha1指定希哈函数库位置。
第6.3节 编译安装Mysql
[root@server lnmp]# tar xf mysql-5.1.49.tar.gz
[root@server lnmp]# cd mysql-5.1.49
[root@server mysql-5.1.49]# autoreconf --force --install
[root@server mysql-5.1.49]# ./configure \
"--prefix=/usr/local/mysql" \
"--localstatedir=/var/lib/mysql/" \
"--enable-assembler" \
"--with-extra-charsets=all" \
"--enable-thread-safe-client" \
"--with-client-ldflags=-all-static" \
"--with-mysqld-ldflags=-all-static" \
"--with-pthread" \
"--with-big-tables" \
"--without-debug" \
"--with-ssl"
[root@server mysql-5.1.49]# make && make install
[root@server mysql-5.1.49]# useradd mysql
[root@server mysql-5.1.49]# /usr/local/mysql/bin/mysql_install_db --user=mysql
49
第6 章 源代码搭建LNMP
[root@server ~]# cd /usr/local/mysql
[root@server mysql]# chown -R root:mysql .
[root@server mysql]# chown mysql. /var/lib/mysql -R
[root@server mysql]# cp share/mysql/my-huge.cnf /etc/my.cnf
[root@server mysql]# cp share/mysql/mysql.server /etc/init.d/mysqld
[root@server mysql]# chmod 755 /etc/init.d/mysqld
[root@server mysql]# chkconfig --add mysqld
[root@server mysql]# service mysqld start
[root@server mysql]# echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc
[root@server mysql]# . ~/.bashrc
Autoconf可以用来分析用户的系统,判断是否符合POSIX标准,并提供相应解决方
法。编译安装mysql时我们尽量以静态化方式编译,提高mysql性能,在安装之前你应该
已经停止机器上原有的mysql,甚至应该将原本的卸载。--enable-assembler参数将会使
mysql使用一些字符函数的汇编版本,--with-extra-charsets设置了支持的字符集,--
enable-thread-safe-client和--with-pthread这两个参数要求mysql使用线程库并以线程方
式编译了客户端。将 /usr/local/mysql 目录的所有者改为 root.mysql 是为了安全性。源代
码编译mysql时,我们还需要手工创建配置文件和system V 服务脚本。Mysql的安装可
能需要花费一些时间,所以编译安装时可以休息一会。
第6.4节 编译安装php
在安装php之前要首先安装以下几个库
gd2
libiconv
libmcrypt
50
第6 章 源代码搭建LNMP
mhash
spawn-fcgi
libevent
gd2是一个用以生成图形图片的库,RHEL自带gd2的开发包,但是版本比较低,生
成的图片是黑白的,非常不美观,因此这边单独编译一个高版本。
libiconv 用于实现一个字符编码到另一个字符编码的转换。
libmcrypt 可以使php支持更多加密算法。
mhash是一个哈稀演函数库,它可以支持多种哈稀演算法,例如最出名的
MD5、SHA1 或 GOST,还有其它多种的哈稀演算法。
spawn-fcgi spawn-fcgi原本是lighttpd的一个用来控制php-cgi的工具,现在已从
lighttpd中独立出来成为一个开源项目。我们可以用它来启动,控制,管理php-cgi的进程。
使用它有诸多好处,比如我们可以将运行php-cgi的主机与Nginx分离开来,以减轻
Nginx服务器的负担,或者用来扩展架构,做更多的负载分担。减少进程的重复创建所带来
的性能消耗等等。
libevent 是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部
使用select、epoll、kqueue等系统调用管理事件机制。
编译安装gd2:
[root@server lnmp]# tar xf gd-2.0.35.tar.bz2
[root@server lnmp]# cd gd-2.0.35
[root@server gd-2.0.35]# ./configure –prefix=/usr/local/gd2
[root@server gd-2.0.35]# make && make install
编译安装 libiconv:
[root@server lnmp]# tar xf libiconv-1.13.1.tar.gz
[root@server lnmp]# cd libiconv-1.13.1
51
第6 章 源代码搭建LNMP
[root@server libiconv-1.13.1]# ./configure
[root@server libiconv-1.13.1]# make && make install
编译安装libmcrypt:
[root@server lnmp]# tar xf libmcrypt-2.5.7.tar.gz
[root@server lnmp]# cd libmcrypt-2.5.7
[root@server libmcrypt-2.5.7]# ./configure
[root@server libmcrypt-2.5.7]# make && make install
编译安装 mhash:
[root@server lnmp]# tar xf mhash-0.9.9.9.tar.bz2
[root@server lnmp]# cd mhash-0.9.9.9
[root@server mhash-0.9.9.9]# ./configure
[root@server mhash-0.9.9.9]# make && make install
编译安装spawn-fcgi:
[root@server lnmp]# tar xf spawn-fcgi-1.6.3.tar.gz
[root@server lnmp]# cd spawn-fcgi-1.6.3
[root@server spawn-fcgi-1.6.3]# ./configure --prefix=/usr/local/spawn-fcgi
[root@server spawn-fcgi-1.6.3]# make && make install
编译安装ibevent:
[root@server lnmp]# tar xf libevent-1.4.14b-stable.tar.gz
[root@server lnmp]# cd libevent-1.4.14b-stable
[root@server libevent-1.4.14b-stable]# ./configure
52
第6 章 源代码搭建LNMP
[root@server libevent-1.4.14b-stable]# make && make install
编译安装php:
[root@server lnmp]# tar xf php-5.2.14.tar.bz2
[root@server lnmp]# cd php-5.2.14
[root@server php-5.2.14]# ./configure \
"--prefix=/usr/local/php" \
"--enable-fastcgi" \
"--enable-discard-path" \
"--enable-force-cgi-redirect" \
"--with-config-file-path=/usr/local/php/etc" \
"--with-mysql=/usr/local/mysql" \
"--with-mysqli=/usr/local/mysql/bin/mysql_config" \
"--with-iconv-dir" \
"--with-freetype-dir" \
"--with-jpeg-dir" \
"--with-png-dir" \
"--with-gd=/usr/local/gd2/" \
"--with-zlib" \
"--with-libxml-dir" \
"--with-curl" \
"--with-curlwrappers" \
"--with-openssl" \
53
第6 章 源代码搭建LNMP
--with-mhash \
"--with-xmlrpc" \
"--with-mcrypt" \
"--enable-xml" \
"--enable-bcmath" \
"--enable-shmop" \
"--enable-sysvsem" \
"--enable-inline-optimization" \
"--enable-mbregex" \
"--enable-mbstring" \
"--enable-gd-native-ttf" \
"--enable-ftp" \
"--enable-pcntl" \
"--enable-sockets" \
"--enable-zip" \
"--disable-debug" \
"--disable-ipv6"
[root@server php-5.2.14]# make ZEND_EXTRA_LIBS='-liconv'
[root@server php-5.2.14]# make install
[root@server php-5.2.14]# cp php.ini-dist /usr/local/php/etc/php.ini
--enable-fastcgi启动fast-cgi
其中 "--enable-discard-path" 打开这个选项,用户就不能透过浏览器读取类似
.htaccess 的系统安全相关的文件。
54
第6 章 源代码搭建LNMP
"--enable-force-cgi-redirect" 若使用 CGI VERSION 模式来执行 PHP 的设,打开
本选项会增加安全性。例如用户读 http://my.host/cgi-bin/php/secret/doc.html 遇到比较了
解 PHP 系统的黑客级用户可能会自已输入以下网址 http://my.host/secret/doc.html 来读
取相关信息。若 PHP 和 Apache 编译在一起,让 PHP 变成 Apache 的一部份,则不需要
加入本选项。
--with-config-file-path在指定php主配置文件的路径
--with-mysql和--with-mysqli在指定你的mysql的位置和它的相关工具
--with-iconv-dir,--with-freetype-dir,-with-jpeg-dir,--with-png-dir,--withgd,--
with-zlib,--with-libxml-dir这些都是在启用对某种文件的支持
--with-curl和--with-curlwrappers是用于支持curl函数,此函数允许你用不同的协议
连接和沟通不同的服务器
--with-openssl,--with-mhash,--with-mcrypt这都是和加密有关的参数,启用它们
是为了让php可以更好的支持各种加密。
"--enable-bcmath" 高精度数学运算组件。
"--enable-shmop" 和 "--enable-sysvsem" 使得你的PHP系统可以处理相关的IPC
函数 。IPC是一个Unix标准通讯机制,它提供了使得在同一台主机不同进程之间可以互相
通讯的方法。
"--enable-inline-optimization" 栈堆指针和优化线程。
"--enable-pcntl" 多线程优化。
make ZEND_EXTRA_LIBS='-liconv' 手工指定将iconv加到php额外库中,一般
来说这些库的增加php可以自动完成,只是iconv貌似不太合群,需要手工操作。
make完了之后,如果没有错误,你也可以执行一下make test看看是否有错误,不过
时间会比较长。
第6.5节 安装php扩展模块工具
安装扩展模块是为了进一步完善我们的php,或提高性能,或提高安全性,或扩展功能,
55
第6 章 源代码搭建LNMP
或增加稳定性等。我们接下来会安装如下扩展模块:
memcache
eaccelerator
PDO_MYSQL
ImageMagick
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一
的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检
索的结果等。
eAccelerator加速引擎是基于mmcache开发的PHP加速优化软件。通过编译和缓存
来增加PHP脚本的性能,使得PHP脚本在编译的状态下降低服务器负载,对服务器的开销
几乎完全消除。它还对脚本起优化作用,能加快其执行效率,提高PHP应用执行速度最高
达10倍。
PDO_MYSQL 是一个php的扩展模块,可以让php更好调用mysql。
ImageMagick是一个用于查看、编辑位图文件以及进行图像格式转换的开放源代码软
件套装。
编译安装memcache:
[root@server tmp]# tar -zxf memcache-3.0.4.tgz
[root@server tmp]# cd memcache-3.0.4
[root@server memcache-3.0.4]# /usr/local/php/bin/phpize
[root@server memcache-3.0.4]# ./configure --with-php-config=/usr/local/php/bin/phpconfig
[root@server memcache-3.0.4]# make && make install
编译安装eaccelerator:
[root@server lnmp]# tar xf eaccelerator-0.9.6.1.tar.bz2
56
第6 章 源代码搭建LNMP
[root@server lnmp]# cd eaccelerator-0.9.6.1
[root@server eaccelerator-0.9.6.1]# /usr/local/php/bin/phpize
[root@server eaccelerator-0.9.6.1]# ./configure --enable-eaccelerator=shared --with-phpconfig=/
usr/local/php/bin/php-config
[root@server eaccelerator-0.9.6.1]# make && make install
编译安装PDO_MYSQL:
[root@server lnmp]# tar xf PDO_MYSQL-1.0.2.tgz
[root@server lnmp]# cd PDO_MYSQL-1.0.2
[root@server PDO_MYSQL-1.0.2]# /usr/local/php/bin/phpize
[root@server PDO_MYSQL-1.0.2]# ./configure --prefix=/usr/local/pdo-mysql --with-phpconfig=/
usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
[root@server PDO_MYSQL-1.0.2]# make && make install
编译安装ImageMagick:
[root@server lnmp]# tar xf ImageMagick-6.5.9-10.tar.bz2
[root@server lnmp]# cd ImageMagick-6.5.9-10
[root@server ImageMagick-6.5.9-10]# ./configure \
--enable-shared \
--with-modules \
--without-x \
--with-gs-font-dir=default \
--with-perl=yes \
--with-zlib=yes \
--with-jpeg=yes
57
第6 章 源代码搭建LNMP
[root@server ImageMagick-6.5.9-10]# make && make install
编译安装imagick:
[root@server lnmp]# tar xf imagick-3.0.0.tgz
[root@server lnmp]# cd imagick-3.0.0
[root@server imagick-3.0.0]# /usr/local/php/bin/phpize
[root@server imagick-3.0.0]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@server imagick-3.0.0]# make && make install
--with-php-config在指定php的配置工具,/usr/local/php/bin/phpize 是用来扩展
php的扩展模块的,通过phpize可以建立php的外挂模块。
第6.6节 使PHP扩展生效
修改php主配置文件,以使php支持扩展模块。
[root@server ~]# cat >> /usr/local/php/etc/php.ini << ENDF
[eAccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-
20060613/eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/usr/local/cache/ea"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
58
第6 章 源代码搭建LNMP
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
ENDF
[root@server ~]# mkdir -p /usr/local/cache/ea
[root@server ~]# vi php.ini
将
expose_php = On
改为
expose_php = Off
找到
extension_dir
改为
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
并在其下面追加三行内容
extension = "memcache.so"
extension = "pdo_mysql.so"
extension = "imagick.so"
将
output_buffering = Off
59
第6 章 源代码搭建LNMP
改为
output_buffering = On
expose是php的一个参数,关闭它则会显示更少的php消息,以提高安全性。
output_buffering是一个缓存有关的参数选项。
更多php核心参数的配置请参考 http://manual.phpv.net/zh/ini.core.php
第6.7节 整合Nginx与php
在http {} 全局配置部分加入如下内容:
http
{
...
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 128k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
60
第6 章 源代码搭建LNMP
proxy_temp_path /dev/shm/proxy_temp;
fastcgi_temp_path /dev/shm/fastcgi_temp;
client_body_temp_path /dev/shm/client_body_temp;
#spawn-fcgi开启9000跟9001两个端口,利用nginx的upstream负载均衡php程序到不同的
fcgi端口上面
upstream spawn {
server 127.0.0.1:9000 max_fails=0 fail_timeout=30s;
server 127.0.0.1:9001 max_fails=0 fail_timeout=30s;
}
...
}
修改监听80端口的虚拟主机 "location ~ \.php { ... }" 的配置
server
{
....
location ~ \.php$ {
root html;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass spawn;
61
第6 章 源代码搭建LNMP
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
include spawn_php5.conf;
}
...
}
创建spawn_php5.conf
[root@server ~]# vi /usr/local/nginx/conf/spawn_php5.conf
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
62
第6 章 源代码搭建LNMP
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
配置spawn-fcgi启动脚本
[root@server ~]# vi /usr/local/php/bin/spawn-fcgi
#! /bin/sh
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin :/usr/local/spawn-fcgi/bin
DESC="spawn-fcgi daemon"
NAME=spawn-fcgi
DAEMON=/usr/local/spawn-fcgi/bin/$NAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
d_start() {
$DAEMON -a 127.0.0.1 -p 9000 -C 128 -u nginx -g nginx -f /usr/local/php/bin/php-cgi
> /dev/null 2>&1
$DAEMON -a 127.0.0.1 -p 9001 -C 128 -u nginx -g nginx -f /usr/local/php/bin/php-cgi
> /dev/null 2>&1 || echo -n " adress already inuse"
63
第6 章 源代码搭建LNMP
}
d_stop() {
/usr/bin/killall -9 php-cgi > /dev/null 2>&1 || echo -n " not running"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
d_start
echo "ok"
;;
stop)
echo -n "Stopping $DESC: $NAME"
d_stop
echo "ok"
;;
restart)
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 1
d_start
;;
64
第6 章 源代码搭建LNMP
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 3
;;
esac
exit 0
[root@server conf]# chmod +x /usr/local/php/bin/spawn-fcgi
第6.8节 启动Nginx 服务
先启动spawn-fcgi CGI服务:
[root@server ~]# /usr/local/php/bin/spawn-fcgi start
然后测试Nginx服务配置是否正确:
[root@server ~]# /usr/local/nginx/sbin/nginx -t
如果返回如下信息,说明配置正确
the configuration file /usr/local/nginx//conf/nginx.conf syntax is ok
configuration file /usr/local/nginx//conf/nginx.conf test is successful
正式启动Nginx服务:
[root@server ~]# /usr/local/nginx/sbin/nginx
建立phpinfo测试页面
65
第6 章 源代码搭建LNMP
[root@server ~]# vi /usr/local/nginx/html/test.php
<?php
phpinfo
?>
搭建discuz环境测试。
第6.9节 课后练习
1:源代码搭建lnmp环境。
66
第7章 课后练习参考答案
第7章 课后练习参考答案
第一章 略
第二章
1.源代码编译Nginx。
挂载服务器共享目录,并从服务器上将nginx源代码拷备到本地
[root@example ~]# mount 192.168.0.254:/var/ftp/pub /mnt
[root@example ~]# cp /mnt/tools/iterm/nginx-0.8.46.tar.gz /tmp
解压并进行编译安装
[root@example ~]# cd /tmp
[root@example tmp]# tar xf nginx-0.8.46.tar.gz
[root@example tmp]# cd nginx-0.8.46
[root@example nginx-0.8.46]#./configure --user=nginx --group=nginx
--prefix=/usr/local/nginx/ --with-http_stub_status_module --with-http_ssl_module
[root@example nginx-0.8.46]#make
[root@example nginx-0.8.46]#make install
启动Nginx服务并测试
[root@example nginx-0.8.46]# /usr/local/nginx/sbin/nginx
[root@example nginx-0.8.46]# links localhost
2.创建Nginx服务管理脚本。
在/etc/init.d目录下创建Nginx服务脚本
67
第7 章 课后练习参考答案
[root@example ~]# vi /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
68
第7章 课后练习参考答案
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
69
第7 章 课后练习参考答案
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
killall -9 nginx
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
70
第7章 课后练习参考答案
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
71
第7 章 课后练习参考答案
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|
configtest}"
exit 2
esac
72
第7章 课后练习参考答案
修改权限
[root@example ~]# chmod 755 /etc/init.d/nginx
加入chkconfig 管理列表
[root@example ~]# chkconfig --add nginx
使用service 命令进行重启测试
[root@example ~]# service nginx restart
第三章
1. 配置两个基于名称的虚拟主机 www.test.com 和 www.example.com (注意,做
此实验之前你应该已经有正确的DNS配置)。
修改Nginx主配置文件,增加两个server 字段。
[root@example ~]# vi /usr/local/nginx/conf/nginx.conf
#在http字断中加入以下两断内容
server {
listen 80;
server_name www.example.com;
root exmaple.com
index index.html
}
server {
listen 80;
server_name www.test.com;
test.com
73
第7 章 课后练习参考答案
index index.html
}
创建相关网站主目录并重启Nginx服务。
[root@example ~]# mkdir /usr/local/nginx/html/example.com
[root@example ~]# echo “www.example.com” >
/usr/local/nginx/html/example.com/index.html
[root@example ~]# mkdir /usr/local/nginx/html/test.com
[root@example ~]# echo www.test.com > /usr/local/nginx/html/test.com/index.html
[root@example ~]# service nginx restart
2. 配置一个https。以使你的服务器可以提供一个安全的连接。
生成安全密钥。
[root@example ~]# cd /etc/pki/tls/certs
[root@example certs]# cd /etc/pki/tls/certs
[root@example certs]# make server.key
[root@example certs]# openssl rsa -in server.key -out server.key
[root@example certs]# make server.csr
[root@example certs]# openssl x509 -in server.csr -req -signkey server.key -days 365 -out
server.crt
修改Nginx主配置文件,加入ssl 相关配置。
[root@example certs]# vi /usr/local/nginx/conf/nginx.conf
#在http段中加入以下配置
server {
74
第7章 课后练习参考答案
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html;
}
}
重启Nginx服务。
[root@example ~]# service nginx restart
3. 配置你的虚拟主机(www.test.com),当别人试图访问时,要求进行身份认证,允
许mark用户可以通过密码uplooking进行访问。
修改Nginx 主配置文件 增加auth相关配置
[root@example ~]# vi /usr/local/nginx/conf/nginx.conf
#修改location / 字段
location / {
75
第7 章 课后练习参考答案
root html;
index index.html index.htm;
auth_basic "xxxx";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
创建认证使用密码文件
[root@example nginx]# htpasswd -c /usr/local/nginx/passwd.db mark
New password: (输入密码 uplooking)
Re-type new password: (again)
Adding password for user mark
重启Nginx服务。并访问测试
[root@example ~]# service nginx restart
第四章
1. 配置虚拟主机 *.test.com 。当客户端访问任意 XXX.test.com时都能匹配此主机并
将地址重写成 www.test.com/XXX/ (注意,实验之前你应该保证 XXX.test.com都能正
常解析)
修改主配置文件,配置虚拟主机 *.test.com
书写if语句,判断如果以test.com结尾的由进行url重写
将 test.com 之前的内容保存于一个变量domain中
将原地址重写成 www.test.com/$domain/
server {
listen 80;
76
第7章 课后练习参考答案
server_name *.test.com;
if ( $http_host ~* "^(.*)\.test\.com$") {
set $domain $1;
rewrite ^(.*) http://www.test.com/$domain/ break;
}
}
2. 当用户访问服务器 http://www.test.com/page-uid-123.html 时服务器自动将地址
重写成 http://www.test.com/page.php?uid=123,当访问 http://www.test.com/pageusername-
123.html重写成 http://www.test.com/page.php?username=123 。其中
123.html可能是任意数字文件名 XXX.html
配置主配置文件并书写rewrite规则
使用location语句。
在Rewrite中将username和uid字段保存下来,并以变量$1方式引用。
将XXX.html字段保存下来,并以变量$2方式引用。
location ~* \.html$ {
rewrite /page-(uid|username)-([0-9]+)\.html /page.php?$1=$2 last ;
}
3. 当用户访问服务器 http://www.test.com/today-pic-112.html 时服务器自动将地
址重写成 http://www.test.com/today/pic/112.html。(注意,此处today pic 可以更换成
其他任意字母,112可以更换成其他任意数字)
配置主配置文件并书写rewrite规则
配置以html结尾的文件做rewrite
将today pic 112 字段分别保存下来并以$1 $2 $3方式引用
77
第7 章 课后练习参考答案
location ~* \.html {
rewrite /([a-z]+)-([a-z]+)-([0-9]+)\.html /$1/$2/$3.html last;
}
第五章
1. 配置Nginx做为前端反向代理(IP为192.168.0.188),将http请求以轮询的方式
转发至后端两台apache服务器(两台apache服务器IP分别为192.168.0.220
192.168.0.221)。
配置apache服务器
登录到192.168.0.220 配置httpd服务
[root@example nginx]# rpm -ivh httpd*
[root@example nginx]# echo 'this is 192.168.0.220' > /var/www/html/index.html
[root@example nginx]# service httpd start
登录到192.168.0.221 配置httpd服务
[root@example nginx]# rpm -ivh httpd*
[root@example nginx]# echo 'this is 192.168.0.221' > /var/www/html/index.html
[root@example nginx]# service httpd start
配置Nginx代理服务器
设置proxy相关参数
[root@example nginx]# vi /usr/local/nginx.conf
#在httpd字段中加入如下内容
http {
…...
78
第7章 课后练习参考答案
client_max_body_size 300m;
client_body_buffer_size 128k;
client_body_temp_path /dev/shm/client_body_temp;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /dev/shm/proxy_temp;
#配置Nginx接收到客户请求后使用upstream地址池
upstream server_pool {
server 192.168.0.220:80 weight=8 max_fails=2 fail_timeout=30s;
server 192.168.0.221:80 weight=8 max_fails=2 fail_timeout=30s;
}
}
修改Nginx主配置文件,在server中location / 配置部分做如下修改:
[root@example nginx]# vi /usr/local/nginx.conf
location / {
proxy_pass http://server_pool/;
proxy_redirect off;