LNMP环境配置
第15章 LNMP环境配置
和LAMP唯一不同的是,LNMP中的N指的是Nginx(类似于Apache的一种Web服务软件)。目前这种环境的应用也非常多。Nginx设计的初衷是提供一种快速、高效、多并发的Web服务软件。在静态页面上的处理,Nginx较Apache更胜一筹;但在动态页面的处理上,Nginx并不比Apache有优势。
15.1 安装MySQL
LNMP中MySQL的安装步骤和LAMP一样,如下所示:
# tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
# cd /usr/local/mysql
# useradd mysql
# mkdir /data/
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
# cp support-files/my-default.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod 755 /etc/init.d/mysqld
# vim /etc/init.d/mysqld
需要修改的地方有datadir=/data/mysql(前面初始化数据库时定义的目录)。把启动脚本加入系统服务项,设定开机启动并启动MySQL,
如上所示即为启动成功
15.2 安装PHP
针对Nginx的PHP安装和上一章的PHP安装是有区别的。因为Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHP的fastcgi,而httpd是把PHP作为自己的模块来调用的。
(1)解压源码包,创建账号,命令如下:
该账号用来运行php-fpm服务。在LNMP环境中,PHP以一个服务php-fpm的形式出现,独立存在于Linux系统中,方便管理。
(2)配置编译选项,命令如下:
# cd php-5.6.30
# yum install libxml2 【并安装这么些安装包】
# yum install libxml2-devel -y
# wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
解压后,进入目录
# ./config
# make && make install
# yum -y install libcurl libcurl-devel
# yum -y install libjpeg-devel
# yum install -y libpng-devel
# yum install -y freetype-devel
# yum install -y epel-release
# yum install -y libmcrypt-devel
(3)编译PHP,命令如下:
# make
(4)安装PHP,命令如下
# make install
(5)修改配置文件,命令如下:
把如下内容写入该文件:
保存配置文件后,检验配置是否正确的方法如下所示:
显示“test is successful”说明成功没有问题,否则根据提示检查文件
(6)启动php-fpm,命令如下:
设置php-fpm开机启动并检验的命令如下:
15.3 安装Nginx
(1)下载和解压Nginx,命令如下:
# cd /usr/local/src
(2)配置编译选项,命令如下:
若出现以上错误,请安装包。
(3)编译和安装Nginx,命令如下:
# make && make insatll
(4)编写Nginx启动脚本,并加入系统服务,命令如下:
# vim/etc/init.d/nginx / / 写入以下内容:
保存脚本后更改权限,命令如下:
如果想开机启动Nginx,命令如下:
(5)更改Nginx的配置文件
首先把原来的配置文件清空,操作方法如下:
重定向符号 > 单独使用时,可以把一个文本文档快快速清空
/ / 写入以下内容
保存配置文件后,需要先检验一下是否有错误,命令如下:
显示如上内容,则说明配置正确。
(6)启动Nginx,命令如下:(检查是否启动用以下命令)
(7)测试是否正确解析PHP。
首先创建测试文件,操作方法如下。
# vim /usr/local/nginx/html/2.php 并写入以下内容
执行如下命令测试文件:
如上方显示的内容说明PHP解析正常。
15.4 Nginx配置
15.4.1 默认虚拟主机
在Nginx中也有默认虚拟主机,跟httpd类似,第一个被Nginx加载的虚拟主机就是默认主机。但和httpd不相同的地方是,它还有一个配置用来标记默认虚拟主机。也就是说没有标记,第一个虚拟主机为默认虚拟主机。
修改主配置文件nginx.conf,在结束符号}上面加入一行配置,改写如下:
意思是,/usr/local/nginx/conf/vhost/下面的所有以.conf结尾的文件都会加载,这样就可以把所有虚拟主机配置文件放到vhost目录下面了。
// 写入以下内容
/ /有这个default_server标识的就是默认虚拟主机
访问一个没有定义过的域名,也会访问到aaa.com
15.4.2 用户认证
再来创建一个新的虚拟主机:
/ / 写入以下内容
创建aming用户,核心配置语句就两行,auth_basic打开认证,auth_basic_user_file指定用户密码文件,当然前提是这个用户密码文件存在。而生成用户密码文件的工具需要借助httpd的htpasswd,Nginx不自带这个工具。下面可以使用curl命令来验证:
说明:状态码为401说明,该网站需要验证。
打开Windows的hosts文件,并加入一行(更改IP):
192.168.50.15 test.com
然后在浏览器中访问test.com,出现如下所示对话框
输入用户名aming和其密码,就可以访问了。如果针对某个目录做用户认证,需要修改location后面的路径。
15.4.3 域名重定向
Niginx的域名重定向和httpd类似,
在Nginx配置中,server_name后面可以跟多个域名,permanent为永久重定向,相当于httpd的R=301。另外还有一个常用的redirect,相当于httpd的R=302。测试过程如下:
15.4.4 Nginx的访问日志
先来看看Nginx的日志格式:
和httpd类似,也是在主配置文件中定义的日志格式。combined_realip为日志格式的名字,后面可以调用它;$remote_addr为访问网站的用户的出口IP;$http_x_forwarded_for为代理服务器IP,如果使用了代理,则会记录代理的IP;$time_local为当前的时间;$host为访问的主机名;$request_uri为访问的URL地址;$status为状态码。
然后再到虚拟主机配置文件中指定访问日志的路径:
使用access_log来指定日志的存储路径,最后面指定日志的格式名字:
Nginx的日志不像httpd还有自带的切割工具,要想切割Nginx日志需要借助系统的切割工具或者自定义脚本。下面是Nginx的日志切割脚本:
最后一行为需要的任务计划。
15.4.5 配置静态文件不记录日志并添加过期时间
需求和httpd中的一样,虚拟主机配置文件改写如下:
使用location~可以指定对应的静态文件,expires配置过期日期,而access_log配置为off就可以不记录访问日志了。
# /usr/local/nginx/sbin/nginx -s reload (加在 -t 命令后面)
访问js类型的文件,缓存过期时间为12小时
去看一下日志:
访问了js以及jpg,但都没有记录到访问日志中,效果实现了。
15.4.6 Nginx防盗链
思路和httpd的一样,配置也不难,由于和过期时间、不记录日志有部分重合,可以把两部分组合在一起:
测试过程如下:
可以看到不仅仅有过期时间,还有防盗链的功能。
15.4.7 访问控制
和httpd一样。Nginx也需要限制某些IP不能访问或者只允许某些IP访问。配置方法和httpd很像,比如,我们有个需求“使访问admin目录的请求只允许192.168.188.1和127.0.0.1访问”,配置文件如下:
在配置httpd的时候,还有一个order,来定义先allow还是先deny,在Nginx里并没有,只要匹配规则就结束了。例如来源IP192.168.50.15,他会从上到下逐一去匹配,第一个IP不匹配,第二个IP也不匹配,直到第三行才匹配,匹配规则为deny(也就是拒绝访问),所以最终会返回一个403的状态码。
配置文件中的IP也可以为IP段,比如可以写成allow 192.168.188.0/24。如果只拒绝某几个IP,就可以写成这样了:
location /admin/
{
deny 192.168.50.1;
deny 127.0.0.1;
}
如果是黑名单的形式,就不需要写allow all了。因为默认就是允许所有。除了这种简单地限制目录外,也可以根据正规匹配来限制,如下:
location ~ .*(abc | image)/.*\.php$
{
deny all;
}
小括号里面的竖线为分隔符,它们之间是“或者”的意思,这样就可以把访问的URL中带有abc或者image字符串,并且是PHP的请求拒绝访问。在Nginx配置里,也可以针对user_agent做一些限制:
if ($http_user_agent ~ ‘Spider/3.0|YoudaoBot’|Tomato’)
{
Return 403;
}
其中~为匹配符号,只要user_agent中含有Spider/3.0或者Tomato字符串的,都会被拒绝,return 403为直接返回403的状态码,当然也可以把它替换为deny all。
15.4.8 Nginx解析PHP
在LAMP中,PHP是作为httpd的一个模块出现的,只要PHP模块被加载,那么就能解析PHP脚本了。而在LNMP中,PHP是一个服务(php-fpm)的形式存在的,首先要启动php-fpm服务,然后Nginx再和php-fpm通信。也就是说,处理PHP脚本解析工作的是由php-fpm来完成的,Nginx仅仅是一个“搬运工”,它把用户的请求传递给php-fpm,php-fpm处理完成后把结果传递给Nginx,Nginx再把结果返回给用户。
其中fastcgi_pass用来指定php-fpm的地址,如果php-fpm监听的是一个tcp:port的地址(比如127.0.0.1:9000),那么也需要在这里改成fastcgi_pass 127.0.0.1.9000。这个地址一定要和php-fpm服务监听的地址匹配,否则会报错502。
还有一个地方也需要注意,factcgi_param SCRIPT_FILENAME后面跟的路径为该站点的根目录,和前面面定义的root那个路径保持一致。如果这里配置不对,访问PHP页面会出现404。
15.4.9 Nginx代理
Nginx的代理功能非常实用,这也是Nginx比httpd越来越受欢迎的一个原因。一家公司有很多台服务器,为了节省成本,不能为所有服务器都分配公网IP,而如果一个没有公网IP的服务器要提供Web服务,就可以通过代理来实现。
用户<=====>Ningx代理<=====>Web服务器
如果Nginx后面有多台Web服务器,如果同时代理,那Nginx在这里就起到一个负载均衡的作用,这个功能在生产环境中用的也特别多。来看Nginx的代理如何配置:
写入以下内容
Proxy_pass指定要代理的域名所在的服务器IP,后面的三行为定义发往后端Web服务器的请求头,第二行必须有,否则代理不成功,它表示后端Web服务器的域名和当前配置文件中的server_name保持一致,第三行和第四行可以省略。
下面是一个负载均衡的示例,在编写Nginx虚拟主机配置文件之前,先来看一看www.qq.com域名对应的IP。
可以看到有两个IP,这两个IP都可以访问到www.qq.com。
15.4.10 Nginx配置SSL
HTTPS,它就是一种加密的HTTP协议,如果HTTP通信的数据包在传输过程中被截获,我们可以破译这些数据包里面的信息。
其通信过程大致如下。
(1) 浏览器发送一个HTTPS请求给服务器。
(2) 服务器要用一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端检验通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。
(3) 服务器会把公钥传输给客户端。
(4) 客户端(浏览器)收到公钥后,会检验其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串,并用收到的公钥加密。
(5) 客户端把加密后的随机字符串传输给服务器。
(6) 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串后,再用这串随机字符串加密传输的数据(该加密为“对称加密”)。
(7) 服务器把加密后的数据传输给客户端。
(8) 客户端收到数据后,再用自己的私钥(也就是那个随机字符串)解密。
可以确定服务器上必须有一对公钥和私钥,也就是SSL证书。
SSL证书配置过程如下所示:
openssl命令如果没有,使用yum install -y openssl安装。
以上操作的最终目的是生成aminglinux.key和aminglinux.crt两个文件。其实购买的SSL证书主要是得到这两个文件,有了这两个文件就可以配置Nginx了。配置过程如下:
保存配置文件后,检查配置是否有问题,
这说明,当前的Nginx并不支持SSL,这是因为在先前的Nginx编译时,并没有额外配置支持SSL的参数,要解决该问题只能重新编译一遍Nginx并安装,操作如上所示。
编译完成后,再来检验一遍:
没有问题后,创建对应的目录和测试文件:
在编辑hosts文件,写入一行:
192.168.50.15 aming.com
用浏览器访问https://aming.com/1.php会提示不安全
这是因为该证书为我们自己制作的,并没有得到浏览器的认可,如果想继续访问,可以点“高级”,然后点“添加例外”,在弹出的对话框点击“确认安全例外”,然后就可以访问网站内容了。
15.5 php-fpm配置
和LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在。既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它类似于nginx.conf里面的include。
15.5.1 php-fpm的pool
Nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket,先把php-fpm.conf做一个更改:
include的这一行比较特殊,请注意等号后面的路径,必须写上etc目录,然后需要创建配置文件目录和子配置文件:
保存文件,再编辑另外的配置文件:
这样就有两个子配置文件,也就是说有两个pool了,第一个pool监听了/tmp/www.sock,第二个pool监听了/tmp/aming.sock。这样,就可以在Nginx不同的虚拟主机中调用不同的pool,从而达到相互隔离的目的,两个pool互不影响。
然后重启一下php-fpm服务:
再来查看/tmp/目录下面的sock文件:
15.5.2 php-fpm的慢执行日志
通过php-fpm的慢执行日志,可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。
在最后行加入以下内容:
第一行定义超时时间,即PHP的脚本执行时间只要超过1秒就会记录日志,第二行定义慢执行日志的路径和名字。以后遇到PHP网站访问卡顿的问题时,要记得去查看这个慢执行日志。
15.5.3 php-fpm定义open_basedir
它的目的就是安全。Httpd可以针对每个虚拟机设置一个open_basedir,php-fpm同样也可以针对不同的pool设置不同的open_basedir。
在最后一行加入:
只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点了,从而达到安全的目的。
15.5.4 php-fpm进程管理
第一行,定义php-fpm的子进程启动模式,dynamic为动态模式;一次只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children定义的数值。另外一种模式为static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。
pm.start_servers针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。pm.min_spare_servers针对dynamic模式,它定义在空闲时段子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。pm.max_spare_servers也是针对dynamic模式的,它定义在空闲时段子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。pm. max_requests针对dynamic模式,它定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。