Nginx网站服务
理论部分:
在之前的学习中,我们学习了在linux平台下搭建了LAMP这样的动态网站平台。apache通过超强的稳定性深受企业喜欢,但是随着互联网的发展,apache已经很难承受太多的并发发文连接,自从2007年Nginx发布的1.0版本以来,Nginx越来越手企业的推捧这是为什么呢?今天我们就来解答并且学会如何部署LNMP这样的一个web服务平台。
Nginx服务的基础
Nginx由俄罗斯的lgor Sysoev开发,专为性能而开发,其最著名的特点是他的稳定性和低系统资源消耗,以及对并发连接的高处立能力,在一些大型的门户网站纷纷选择Nginx来提供web服务,像现在比较知名的新浪、淘宝、京东、迅雷、搜狐等大型企业都是使用的Nginx来提供WEB服务。经过测试Nginx的并发访问理论上是可以达到50000个。今天我们就一起来学习一下如何部署LNMP这样的一个动态网站环境。
一、安装及运行控制
1、nginx的编译安装
Nginx的最新版本为1.6.0其安装文件可以从官网下载http://www.nginx.org下载,今天我们就来使用最新版本1.6.0为例,介绍Nginx的安装和运行控制。
今天的环境是一个实验环境使用vmwareworkstarion来模拟这样的一个虚拟环境,以CENTOS6.5版本的操作系统为例。
实验拓扑
图1
以上就是我们今天的实验环境,我的主机是base基本安装,我已经安装好了gcc编译器,如果你的系统中在我们编译安装的时候出现错误请提前安装gcc编译器。
1)安装支持的软件
在编译安装Nginx之前我们需要做一些准备工作,需要安装pcre、zlib等软件包的支持,因此预先进行安装一遍提供库文件和头文件。我们之前已经学习过YUM软件仓库了,我们直接使用YUM的方式进行安装
[[email protected] ~]# yum -y install pcre-develzlib-devel
2)创建程序用户和组
Nginx服务默认以nobody身份运行,建议为其创建专门的用户账号,一遍准确的控制权限等问题。我们救你nginx这个用户为例。不建立宿主目录,不允许登录操作系统。
[[email protected] ~]# useradd -M -s /sbin/nologin nginx
3)编译安装nginx
nginx我已经下载好了在我的root目录下,在配置的过程中,我们指定安装的目录为/usr/local/ningx运行的用户和组均设为nginx启用--with-http_stub_status_module模块,便于查看服务器的连接信息,具体请参考./configure --help的帮助信息。
[[email protected] ~]# cd nginx-1.6.2
[[email protected] nginx-1.6.2]#./configure --prefix=/usr/local/nginx--user=nginx --group=nginx --with-http_stub_status_module && make&& make install
编译完成之后可以输入echo $? 看一下返回值是否为0
为了很好的控制服务器的正常运行,我们可以将主程序nginx创建一个链接文件到/usr/local/sbin目录下或者直接修改PATH环境变量这里我们选择第二种直接修改PATH环境变量。
[[email protected] nginx-1.6.2]# echo "PATH=$PATH:/usr/local/nginx/sbin">> /etc/profile
[[email protected] nginx-1.6.2]# . /etc/profile
2、Nginx的运行控制
1)检查配置文件
可以通过主程序nignx对nginx的配置文件进行检测 -t选项用来对配置文件进行检查,以便找出配置错误的地方未知文件nginx.conf默认位于安装目录下的conf子目录下。若要检查其他位置的配置文件可以结合-c选项。
[[email protected] nginx-1.6.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.confsyntax is ok
nginx: configuration file/usr/local/nginx/conf/nginx.conf test is successful
[[email protected] nginx-1.6.2]#
2)启动、停止nginx
直接运行主程序nginx就可以运行nginx服务器
ps:如果服务器中已存在httpd服务则需要执行停止或者是卸载操作。
我们将nginx服务启动并查看其网络连接状态
[[email protected]]# nginx
[[email protected]]# netstat -anptl | grep "nginx"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4843/nginx
通过上面的输出可以看出nginx的默认监听端口为80进程名为nginx。nginx默认启动一个工作进程
nginx的服务已经启动起来了我们可以在客户端进行测试了,测试的前提是防火墙允许目标端口80入站。
[[email protected]]# iptables -F
[[email protected]]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
通过客户端访问或者通过linux的访问工具进行访问。我们通过linux自带的访问工具访问。
我们需要使用yum进行安装
[[email protected]]# yum -y install elinks
开始访问:
图2
这是在命令行界面下显示的,不是很漂亮,已经成功的访问了,这样我们的nginx就已经能够正常的运行了,我们并没有做任何的配置。ctrl+c退出
既然服务能够启动,既然也能够停止或者是重新启动
我们通过killall 的方式停止或重启nignx服务程序发送HUB信号表示重载服务发送QUIT信号表示结束服务
[[email protected]]# killall -s HUP nginx
[[email protected]]# killall -s QUIT nginx
前者表示重载或者表示杀死,当nginx服务运行的时候PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill命令也可以根据进程号来进行控制
[[email protected]]# kill -9 $(cat /usr/local/nginx/logs/nginx.pid)
3)使用nginx脚本
为了更好的控制服务我们可以用到之前学习的脚本,实现自动化的执行。
vim/etc/init.d/nginx
#!/bin/bash
#chkconfig: 2345 99 20
#description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case"$1" in
if [ $? -eq 0 ]
then
echo "Nginx service alreadyrunning."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
$PROG
echo "Nginx service startsuccess."
else
$PROG -t
fi
fi
if [ $? -eq 0 ]
then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stopsuccess."
else
echo "Nginx service already stop"
restart)
$0 stop
$0 start
;;
status)
if [ $? -eq 0 ]
then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
if [ $? -eq 0 ]
then
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx configsuccess."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage: $0{start|stop|restart|reload}"
exit 1
esac
以上内容就是根据进程文件以及过滤网络连接状态进行控制。写好之后将其添加为系统服务并赋予执行权限。开机自动运行。
[[email protected]]# chmod +x /etc/init.d/nginx
[[email protected]]# chkconfig --add nginx
[[email protected]]# chkconfig nginx on
这样一来我们就可以通过nginx脚本来启动停止nginx服务了。方法是在执行时天加相应的start、stoprestart、reload参数。
二、配置文件nginx.conf
nginx的配置文件与apache的配置文件组成大不相同他的路径在/usr/local/nginx/conf/nginx.conf中,包括全局配置、I/O时间配置和HTTP配置这三大内容,配置语句的格式为关键字 "值"(末尾以;结束)以#开头表示注释。
1、全局配置
有各种配置语句组成,不使用特定的定界标记。全局配置包括Nginx服务的运行用户、工作进程数、错误日志、PID存放位置等参数等基本设置。
#user nobody; //运行的程序用户
worker_processes 1; //启用的工作进程
#error_log logs/error.log; //错误日志的文件位置
#pid logs/nginx.pid; //PID文件存放的位置
全局的配置内容很少其中
第一条定义的是运行nginx的程序用户,由于我们在编译安装时已经指定了运行的程序用户,所以这里以#号注释掉了。
第二条定义了开启的工作进程数量,一般工作进程数量是根据CPU的核数决定的,如果是四核的CPU那么我们可以开启的进程数量为4-8个进程数为CPU的倍数一般为一倍。如果网站的访问量不大设置为1已经够了。关于如何实现过多的并发访问连接我们在介绍http配置的时候会介绍到。
第三条定义了错误日志的文件位置,一般情况下我们直接#号注释掉,因为我们主要还是搭建虚拟主机更多一些,所以这个配置项几乎用不到,直接默认即可。
第四条定义了pid文件的位置,默认的位置logs/的nginx。pid文件。
以上几条配置就是全局的配置。
2、I/O事件配置
使用"events { }" 界定标记,用来指定Nginx进程的响应模型,每个进程的连接数量等限制,对于2.6及以上版本的内核,建议使用epool模型以提高性能,每个进程的连接数应以实际的情况为主,一般在10000以下,默认为1024个。
events {
worker_connections 4096;
use epoll;
}
如工作进程=8每个工作进程处理4096个连接则已经超过了nginx正常提供服务的连接数量已经超过3万个(4096*8=32768)具体的情况还需要根据实际的硬件配置来决定。
通过这里也能看出来nginx的并发访问量的优势吧!apache的工作方式是,有多少个连接就需要开启多少个子进程来响应客户端非常消耗服务器资源。
3、HTTP配置
使用"http{}"界定标记,包括访问日志、HTTP端口、监听地址、网页目录、默认字符集、连续保持时间,以及虚拟主机的配置PHP解析等一些列事情,其中大部分配置语句都包含在了server{}的界定标记中了。
http {
include mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr - $remote_user [$time_local] "$re
quest" ‘ //定义访问日志格式
‘$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;
server {
listen 80; //监听端口
server_name www.benet.com; //站点域名
charset utf-8; //字符集
access_log logs/host.access.log main; //访问日志位置和格式
location / { //根目录配置
root /var/www/benet; //网站文档根目录
index index.html index.htm; //默认索引页
}
error_page 500 502 503 504 /50x.html; //内部错误的反馈界面
location = /50x.html { //错误页面配置
root html; //错误文档目
}
}
}
这里我面我们说一下localtion / 和location= /50x.html
location / 他的作用是匹配来自客户端的任意请求,我们在客户端的游览器输完url路径时在回车的一瞬间在默认会多出一个/出来如图3
图3
这就是localtion /的作用定义了客户端请求的内容,比如现在我在/后面随便输入一些内容,看一下会怎么样。
图4
因为不存在asdasda这个目录这时服务器就会提示找不到客户端请求的目录,这时就会用到了error_page 500 502 503 504 /50x.html 这个配置项,当用户的访问请求找不到的时候就会输出图4的界面,如果输入一个存在的目录这时就会响应。
具体的localtion配置项我们在之后还有一个例子再具体的看一下,我们在看一下
location= /50x.html 这个就是一个精确匹配了,如果在url路径后面输入了他,那么服务器就只能响应这个请求,不能在匹配其他。
图5
这就是精确匹配,如果中间出现一个字符错误看一下图6
图6
这是就会显示404错误,在location / 中所搜不到这个请求,之后由错误页面给吃应答。
具体我们在nginx的访问状态在进行解释
四、访问状态及虚拟主机应用
1、nginx的访问状态统计
我们在编译安装的时候添加了--with-http_stub_status_module模块就是用来统计客户端访问服务器的情况。,要使用次用能需要在配置文件中做一下简单的修改。
location/status {
stub_status on; //打开状态统计功能
access_log off; //关闭此位置的日志记录
}
location /status 就是客户端请求的时候可以输入sta开头就可以了,这是就会默认匹配status目录。我们先进性保存之后进行语法检测如果没有问题,则进行重新启动服务
[[email protected]]# service nginx restart
Nginxservice stop success.
Nginxservice start success.
重启服务之后使用客户端访问
图7
正常访问
图8
以status开头也是没有任何问题的,这就是location / = 的作用
上面的三个数字的解释
第一个1 已处理的连接数
第二个1 成功的tcp三次握手的次数
第三个7 已处理的请求数量
2、基于域名的虚拟web主机
使用Nginx搭建的虚拟主机服务器时,每个虚拟web站点拥有一个server{}配置端,各自监听IP地址、端口号可以改变,当然网站名也是不同的,下面通过搭建两个站点来演示
www.accp.com www.lzg.com
首先为他们准备站点根目录以及默认索引页
[[email protected]]# mkdir /var/www/{accp,lzg}
[[email protected]]# echo "<h1>www.accp.com</h1>" >/var/www/accp/index.html
[[email protected]]# echo "<h1>www.lzg.com</h1>" >/var/www/lzg/index.html
vim /usr/local/nginx/conf/nginx.conf
……省略部分内容
在最后一个}前一行添加
server {
listen 80;
server_name www.accp.com;
charset utf-8;
access_log logs/accp.com.log;
location / {
root /var/www/accp;
index index.html index.php;
}
}
server {
listen 80;
server_name www.lzg.com;
charset utf-8;
access_log logs/lzg.com.log;
location / {
root /var/www/lzg;
index index.html index.php;
}
}
由于是基于域名的虚拟主机所以需要dns解析域名,前面已经学过如何搭建DNS了,今天为了简便直接在win7上修改hosts文件了。
C:\Windows\System32\drivers\etc\hosts
192.168.1.1 www.accp.com
192.168.1.1 www.lzg.com
图9
图10
以上就是访问的结果。
构建LNMP平台及应用部署
一、构建LNMP网站平台
就像构建LAMP平台一样,构建LNMP平台也需要linux系统、mysql服务器、PHP解析环境,区别在于nginx和php协同工作的配置上,我们开始部署
1、安装mysql数据库
mysql之前我们在搭建LAMP时已经做过了,这里我就不解释相关知识点了
1)编译安装mysql
[[email protected]~]# cd cmake-2.8.12
[[email protected]]# ./configure &&make && make install
[[email protected]]# cd ../mysql-5.5.38
[[email protected]]# cmake -DCMAKE=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci-DWITH_EXTRA_CHARSETS=all && make && make install
2)建立mysql的主配置文件和程序文件
[[email protected]]# cp support-files/my-medium.cnf /etc/my.cnf
cp:overwrite `/etc/my.cnf‘? y
[[email protected]]# cp support-files/mysql.server /etc/init.d/mysqld
[[email protected]]# chmod +x/etc/init.d/mysqld
[[email protected]]# chkconfig --add mysqld
ch[[email protected]]# chkconfig mysqld on
[[email protected]]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
[[email protected]]# . /etc/profile
3)初始化数据库
[[email protected]]# useradd -M -s/sbin/nologin mysql
[[email protected]]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/--datadir=/usr/local/mysql/data/
[[email protected]]# service mysqld start
4)启动mysql服务
StartingMySQL.... [ OK ]
[[email protected]]# mysqladmin -u root password ‘123.abc‘
//为root设置密码
2安装PHP解析环境
较新版本(r如5.3)的PHP已经自带FPM(Fastcgi Manager Fastcgi进程管理器)模块用来对PHP解析实例进行管理优化解析效率,在配置php时应该添加--enable-fpm配置项一起用此模块
1)编译安装php
我们今天以5.3.28为例
yum -yinstall gd libxml2-devel libjpeg-devel libpng-devel
[[email protected]]# ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=/usr/local/mysql--with-cofnig-file-path=/usr/local/php5 --enable-mbstring --enable-fpm--with-jpeg-dir=/usr/lib && make && make install
2)建立配置文件并加载zend
zend的版本应该和php的版本在一个版本上
[[email protected]]# cp php.ini-development /usr/local/php5/php.ini
[[email protected]]# cp/root/ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/ZendGuardLoader.so /usr/local/php5/lib/php/
vim /usr/local/php5/php.ini
添加两行
zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so
zend_loader.enable=1
3、配置nginx支持php环境
Nginx本身并没有像apache那样内置php模块,要让Nginx能够解析PHP网页,有两种方法其一,充当中介,将收到的php请求转发给apache让其代为解析其二使用php-fpm调用本机的php环境
1)启用php-fpm进程
[[email protected]]# cd /usr/local/php5/etc/
[[email protected]]# useradd -M -s /sbin/nologin php
[[email protected]]# cp php-fpm.conf.default php-fpm.conf
vimphp-ftp.conf
ps:一行前面的数字是行号
……省略部分内容
25 pid = run/php-fpm.pid //php-fpm的进程文件位置
140 user =php //运行用户
141 group= php //运行组
222 pm.start_servers= 20 //动态方式下时开启的进程数
217 pm.max_children = 50 //静态方式下开启的进程数量
227 pm.min_spare_servers= 10 //最少空闲进程数
232 pm.max_spare_servers= 30 //最多空闲进程数
修改完成之后进行保存
优化执行程序执行路径
[[email protected]]# ln -s /usr/local/php5/bin/* /usr/local/bin/
[[email protected]]# ln -s /usr/local/php5/sbin/* /usr/local/sbin/
[[email protected]]# php-fpm
[[email protected]]# netstat -anpt | grep php-fpm
tcp 0 0127.0.0.1:9000 0.0.0.0:* LISTEN 121056/php-fpm
php-fpm的端口号为9000进程名为php-fpm
在php-fpm.conf文件中 .pid配置指出了pid信息的存放位置,对应的实际路径为/usr/local/php5/var/run/php-fpm.pid。根据上诉信息我们可以修改nginx脚本,以便在启动nginx时将php-fpm一起进行启动
vim/etc/init.d/nginx
……省略部分内容
在esac后面添加
PROG_FPM="/usr/local/sbin/php-fpm"
PIDF_FPM="/usr/local/php5/var/run/php-fpm.pid"
case"$1" in
start)
netstat -anpt | grep"php-fpm" &> /dev/null && pgrep "php-fp
m"&> /dev/null
if [ $? -eq 0 ]; then
echo "php-fpm is running."
else
$PROG_FPM
fi
;;
stop)
netstat -anpt | grep"php-fpm" &> /dev/null && pgrep "php-fpm"
if [ $? -eq 0 ];then
killall -s QUIT php-fpm
echo "php-fpm is down."
fi
;;
esac
2)配置Nginx支持php解析
无论是将php页面交给LAMP平台去解析还是调用本地的php-fpm进程进行解析,都需要在server{}配置段添加location设置
第一种方法将php请求交给192.168.1.100 //模拟,主机并不存在
vim/usr/local/nginx/conf/nginx.conf
在虚拟主机的server{}中添加
location ~\.php$ {
proxy_passhttp://192.168.1.100:80;
}
第二种方法(调用本地的php-fpm进程)
location ~\.php$ { //访问.php页面的配置端
root /var/www/lzg; //php网页文档根目录
fastcgi_pass 127.0.0.1:9000; //php-fpm的监听地址
fastcgi_index index.php; //php默认首页
include fastcgi.conf; //包括fastcgi.conf样本配置
}
我们今天选择第二种方法,这两种方法都比较常用,今天的环境只适合演示第二种。
3)PHP页面访问测试
可以在PHP文档根目录下创建一个测试页用来连接数据库
vim /var/www/lzg/index.php
$link=mysql_connect(‘localhost‘,‘root‘,‘123.abc‘);
if($link)echo "恭喜你数据库连接成功啦!!";
mysql_close();
?>
[[email protected]]# service nginx reload
图11
连接成功了,这就证明我们的LNMP部署的是没有任何问题的。
二、在LNMP平台中部署Web应用
1、下载并部署程序代码
我们就以一套影视程序天空网路其官方网站为http://www.skyuc.com/
可以在上面下载这套影视程序。
将下载的SKYUC程序文件解压到/root目录下,之后将解压目录下的wwwroot移动到/var/www/lzg/skyuc然后对几个目录的属主和属组进行调整,以允许nginx和php-fpm拥有写入权限。
[[email protected]~]# unzip SKYUC_3.4.2_for_php5.3.zip
[[email protected]~]# mv SKYUC.v3.4.2.SOURCE/wwwroot/ /var/www/lzg/skyuc
[[email protected]~]# cd /var/www/lzg/skyuc/
[[email protected]]# chown -R php:php admincp/ data/templates/ upload/
2、创建数据库和数据库用户
为了降低Web应用程序对数据库的风险,建议设置专用的数据库及授权用户,而不是使用root用户。建立skyucdb数据库授权jerry用户拥有所有权限
[[email protected]]# mysql -u root -p123.abc
mysql>create database skyucdb;
Query OK,1 row affected (0.04 sec
mysql>grant all on skyucdb.* to [email protected]‘localhost‘ identified by ‘123.abc‘;
Query OK,0 rows affected (0.07 sec)
3、安装web应用
在客户端游览器输入www.lzg.com/skyuc/install进行安装
图12
接受许可协议,并点击下一步
图13
检测系统环境,如果前面不多权限进行调整的时候,这里会出现相关错误
图14
这里就是刚才创建的数据库和拥有权限的用户,下面设置的是后台管理员的用户和密码。
图15
出现这里就表明安装成功了,这里可以选择前往后台或者前台。
这里选择前往前台
图16
成功访问到了首页。
总结一下:
Nginx默认的工作进程只有一个,可以通过主配置文件中的全局配置进行修改,进程数根据CPU的核数进行设置,每一个进程可以同时进行多个连接,可以通过events配置端进行设置。
Nginx最大的并发访问量理论上为3万——五万,但是还需要根据实际的物理配置。
Nginx的虚拟主机的实现方式就是在nginx.conf中的server{}段进行设置,每个配置端可以独立监听端口、ip地址、当然了域名必须不同。
Nginx默认不支持PHP,所以在编译安装时需要启用--enable-fpm模块,要想解析客户端的PHP请求,需要通过两种方法实现处理PHP请求
1、将php请求转发给其他LAMP平台
2、调用本地的PGP-FPM进程进行解析。
这两种方法都需要在server{}配置段实现。
最后说一点Nginx其实还可以配置成代理服务器,这一点我们之后在进行讲解,其实实现php的第一种方法就是一种代理的一种。
文中应该是有错别字的,请不要见怪,因为这都是熬夜做出来的,有点困了,文中的知识点有不足的地方请各位大神多多指教