LNMP环境配置

 

第15章 LNMP环境配置

 

 

LAMP唯一不同的是,LNMP中的N指的是Nginx(类似于Apache的一种Web服务软件)。目前这种环境的应用也非常多。Nginx设计的初衷是提供一种快速、高效、多并发的Web服务软件。在静态页面上的处理,NginxApache更胜一筹;但在动态页面的处理上,Nginx并不比Apache有优势。

 

15.1 安装MySQL

LNMPMySQL的安装步骤和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

针对NginxPHP安装和上一章的PHP安装是有区别的。因为Nginx中的PHP是以fastcgi的方式结合Nginx的,可以理解为Nginx代理了PHPfastcgi,而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指定用户密码文件,当然前提是这个用户密码文件存在。而生成用户密码文件的工具需要借助httpdhtpasswdNginx不自带这个工具。下面可以使用curl命令来验证:

 

说明:状态码为401说明,该网站需要验证。

打开Windowshosts文件,并加入一行(更改IP):

192.168.50.15     test.com

然后在浏览器中访问test.com,出现如下所示对话框

 

输入用户名aming和其密码,就可以访问了。如果针对某个目录做用户认证,需要修改location后面的路径。

 

15.4.3 域名重定向

Niginx的域名重定向和httpd类似,

 

Nginx配置中,server_name后面可以跟多个域名,permanent为永久重定向,相当于httpdR=301。另外还有一个常用的redirect,相当于httpdR=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.1127.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-fpmphp-fpm处理完成后把结果传递给NginxNginx再把结果返回给用户。

 

其中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的代理功能非常实用,这也是Nginxhttpd越来越受欢迎的一个原因。一家公司有很多台服务器,为了节省成本,不能为所有服务器都分配公网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.keyaminglinux.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-fpmpool

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_basedirphp-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的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。

 

posted @ 2020-12-11 09:39  哆啦丢了梦  阅读(85)  评论(0编辑  收藏  举报