第十二章 LNMP架构(下)

一、Nginx负载均衡
二、ssl原理
三、生成ssl密钥对
四、Nginx配置ssl
五、php-fpm的pool
六、php-fpm慢执行日志
七、open_basedir
八、php-fpm进程管理
九、扩展

一、Nginx负载均衡

Nginx负载均衡需要用到upstream模块。upstream模块用于定义多个web server。通过算法将访问请求分发到不同的web server。

代理一台服务器就做代理,多台就是负载均衡(需要upstream模块)。

配置方式:

1. 以qq.com为例,先使用dig命令获取qq.com的服务器ip

dig命令:可以解析返回服务器的多个IP;dig命令的安装:yum -y install bind-utils

ping:只会返回一个

然后在/usr/local/nginx/conf/vhost/目录下创建一个文件qq_com.conf,写入如下的内容:

扫描二维码关注公众号,回复: 4657175 查看本文章

[root@Linux01 ~]# vim /usr/local/nginx/conf/vhost/qq_com.conf

upstream qq_com                                         ##指定后端服务器列表,可以随意定义,用于proxy_pass调用

{

    ip_hash;                                                  ##ip_hash算法,将同一个源ip的访问请求分发给同一个server,避免数据混乱

    server 111.161.64.40:80;                       #定义后端的server ip:port

    server 111.161.64.48:80;

}

server

{

    listen 80;                                              #监听端口

    server_name www.qq.com qq.com;                #虚拟主机域名

    location /

    {

        proxy_pass      http://qq_com;                      #proxy_pass  调用upstream qq_com

        proxy_set_header Host   $host;                   #下面的配置跟Nginx的代理一样

        proxy_set_header X-Real-IP      $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

无法实现ssl连接的负载均衡,即不支持https,443端口的负载均衡。

2. 测试

①未重启配置的情况情测试访问www.qq.com,访问的是默认主页default.com

②重载 ,再次测试访问www.qq.com,返回的是真实的www.qq.com的首页代码。说明代理设置成功。

二、ssl原理

ssl的原理如下图所示

过程如下:

1.客户端向服务器发起https请求

2.服务器本身需要有一套数字证书(可向互联网上受信任的证书颁发机构申请,收费。也可以自己生成证书,但是不会被浏览器信任,所以需要客户端验证通过,才可以继续访问。)

3.服务器收到https请求后会将公钥传给客户端。

4.客户端浏览器收到公钥后会进行合法性验证。如果证书无效会显示警告信息。如果是有效的证书,则会产生一串随机字符串,并用收到的公钥加密。

5.客户端将加密码的随机字符串传回服务器。服务器端用私钥解密,获得这串随机字符串,服务器端再用这串随机字符串加密传输的数据。(这时候的加密方式称为对称加密,服务器加密数据和客户户解密数据用的同一把钥匙,即这串随机字符串。)

6.服务器端将加密后的数据发送给客户端,客户端收到数据后用同一把钥匙(即随机字符串解密)将数据解密。

参考:数字证书原理

三、生成ssl密钥对

因为向互联网上受信任的证书颁发机构申请证书是收费的,我们是仅仅是测试环境,可以手动生成自己的证书。

配置ssl证书:

1. 证书的生成需要安装openssl包,如果没有,可以用yum安装

[root@Linux01 vhost]# yum -y install openssl
2. 首先进入nginx的配置文件存放目录 /usr/local/nginx/conf。生成密码对

[root@Linux01 conf]# openssl genrsa -des3 -out tmp.key 2048

genrsa表示生成rsa类型的私钥文件,-des3表示使用des3加密算法

-out 指定生成的私钥文件名,2048表示加密算法的长度为2048位。

参数:https://blog.csdn.net/scuyxi/article/details/54884976

生成私钥文件必须输入两次密码。

3. 但是有密码的私钥比较麻烦,下面就来取消私钥文件的密码

[root@Linux01 conf]# openssl rsa -in tmp.key -out dwy.key 
Enter pass phrase for tmp.key:
writing RSA key
[root@Linux01 conf]# rm -f tmp.key

4. 生成证书请求文件,需要拿证书请求文件和没有密码的私钥一起生产公钥文件

[root@Linux01 conf]# openssl req -new -key dwy.key -out dwy.csr

5. 生成公钥文件

[root@Linux01 conf]# openssl x509 -req -days 365 -in dwy.csr -signkey dwy.key -out dwy.crt

# x509 代表生成的x509的证书

# -req 证书请求,用于生成证书文件

# -days 证书的有效期,365表示一年

# -in 指定证书请求文件

# -signkey 指定私钥文件

# -out 指定生成的公钥文件名

查看刚才生成的文件:

[root@Linux01 conf]# ls dwy.*
dwy.crt  dwy.csr  dwy.key
 

四、Nginx配置ssl

这里以aaa.com为例使用自己颁发的证书来配置ssl安全访问.

1. 在/usr/local/nginx/conf/vhost/目录下创建一个文件ssl_test.conf,写入下面的配置内容

[root@Linux01 conf]# vim /usr/local/nginx/conf/vhost/ssl_test.conf

server
{
   listen 443;
   server_name  www.aaa.com aaa.com;
   index index.html index.php;
   root /data/wwwroot/www.aaa.com;
   ssl on;                                                  #启用ssl功能
   ssl_certificate dwy.crt;                         #指定公钥文件
   ssl_certificate_key dwy.key;               #指定私钥文件
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

2. 重载。

如果出现错误:nginx: [emerg] unknown directive “ssl”

需要重新编译安装nginx 加上–with-http_ssl_module

3. 查看443端口是否监听。

如果没有,放行443端口:

[root@Linux01 conf]# firewall-cmd --zone=public --add-port=443/tcp
success
[root@Linux01 conf]# firewall-cmd --zone=public --add-port=443/tcp --permanent 
success

4. 测试访问

①curl 访问本地的https需要添加hosts

[root@Linux01 conf]# echo '127.0.0.1 www.aaa.com aaa.com' >> /etc/hosts

②测试

[root@Linux01 conf]# curl https://aaa.com 

//验证,访问成功,提示未受信任的证书,因为是自己颁发的证书,是不被浏览器代理信任的。

[root@Linux01 conf]# curl -k https://aaa.com 

使用 -k 选项忽略证书检查就可以访问了

③浏览器测试

点击高级,继续访问

五、php-fpm的pool(八、php-fpm进程管理)

php-fpm也可以配置类似nginx虚拟主机的pool,可以将每个pool做成一个单独的配置文件,通过配置php-fpm的池来隔离不同的虚拟主机。

配置方式:

1. 在/usr/local/php-fpm/etc/php-fpm.conf 配置文件的 [global] 部分添加一行配置

include = etc/php-fpm.d/*.conf

[root@Linux01 etc]# vim /usr/local/php-fpm/etc/php-fpm.conf

2. 创建pool配置文件存放目录

[root@Linux01 etc]# mkdir /usr/local/php-fpm/etc/php-fpm.d/


3. 在pool配置文件存放目录创建pool配置文件 dwy.conf 并写入以下内容

[dwy]                                                                 #pool名称可以随意定义

listen = /tmp/dwy.sock                                     #指定这个pool监听的socket文件或者ip:port

listen.mode=666                                             #监听sock文件时,sock文件的权限

user = php-fpm                                               #进程用户

group = php-fpm                                            #进程用户组

pm = dynamic

pm.max_children = 50

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

PHP进程管理参数:

pm = dynamic
    #使用动态进程管理 ,也可以改为static使用静态进程管理
    #当 pm = static时,使用静态线程管理,只有pm.max_children会生效,其他 pm参数都无效

pm.max_children = 50                                    #这个pool的最大线程数

pm.start_servers = 3                                     #初始的线程数

pm.min_spare_servers = 3                           #最小空闲线程数,如果线程低于这个数值,会自动新建线程 

pm.max_spare_servers = 35                       #最大空闲线程数,如果空闲的线程大于这个数值,会自动清理

pm.max_requests = 500                             #每个线程最大出来的请求数

rlimit_files = 1024                                       #使用文件描述符数量,系统每打开一个文件就会消耗一个文件描述符,当文件描述符消耗完了就会报错
文件描述符参考:最大文件描述符详解

4. 再新建一个test.conf配置文件

5. 检查php-fpm配置语法错误。重载配置文件

[root@Linux01 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[14-Dec-2018 22:56:31] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@Linux01 php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

6. 检查php-fpm进程

##最后一列可以看到pool的名称

六、php-fpm慢执行日志 

当有时候访问php网页慢的时候,我们想查找慢的原因,这可以通过配置php-fpm的慢执行日志功能实现。

开启慢执行日志来查看是否是PHP代码执行时间过长,还可以看到具体是哪个PHP文件的哪一行导致的慢执行。

配置方式:

1. vim /usr/local/php-fpm/etc/php-fpm.d/test.conf 加入如下内容

request_slowlog_timeout = 3       #当执行时间超过指定的时间(单位:秒),记录慢执行日志
slowlog = /usr/local/php-fpm/var/log/test-slow.log  #指定慢执行日志文件路径

2. 重新加载配置。

在虚拟主机aaa.com 的根目录/data/wwwroot/www.aaa.com/下创建一个测试文件sleep.php,

[root@Linux01 vhost]# /usr/local/php-fpm/sbin/php-fpm -t
[15-Dec-2018 00:44:42] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@Linux01 vhost]# vim /data/wwwroot/www.aaa.com/sleep.php

<?php
echo 'test slow log';
sleep(4);                                      ##php的sleep()函数可以让程序睡眠指定的秒数,用于模拟PHP执行慢的情况。
echo 'done';
?>

3. 修改虚拟主机配置文件aaa.com.conf下 fastcgi_pass ,把unix:/tmp/php-fcgi.sock改成unix:/tmp/test.sock;(不修改,查看慢日志时就不会显示。即虚拟主机配置文件中的unix和php-fpm中定义的配置文件listen要一致

4. 重载nginx,测试访问

5. 查看慢日志

[root@Linux01 vhost]# cat /usr/local/php-fpm/var/log/test-slow.log

#错误日志可以看到,发生慢执行的时间 pool名,pid

#php文件路径 

#具体哪一行代码产生的慢执行

七、open_basedir

设定open_basedir可以使PHP只能访问指定目录下的文件,隔离不同的虚拟主机以增强安全性。

可以在虚拟主机配置中配置open_basedir;

也可以在php的pool池中配置open_basedir。

配置方式:

1. 修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件

添加open_basedir的配置

#php_admin_value[open_basedir] 这个参数就是定义open_basedir

##/data/wwwroot/www.aaa1com:/tmp/" 这个地址现在是错误的

2. 修改/usr/local/php-fpm/etc/php.ini

将error_reporting的参数修改为E_ALL,修改error_log日志文件路径

[root@Linux01 php-fpm.d]# vim /usr/local/php-fpm/etc/php.ini

3. 手动生成日志文件,并修改权限

[root@Linux01 php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log
[root@Linux01 php-fpm.d]# chmod 777 /usr/local/php-fpm/var/log/php_errors.log
4. 重启php-fpm服务

[root@Linux01 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[root@Linux01 php-fpm.d]#  /etc/init.d/php-fpm reload
5. 访问测试

查看php错误日志:访问的路径不在定义的open_basedir内

6. 再修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件

将open_basedir修改为正确的路径

7. 重启php服务,访问测试

猜你喜欢

转载自blog.csdn.net/dwy2018/article/details/84997103