LNMP架构(三)

12.17 Nginx负载均衡

和简单的代理不一样,负载均衡多了一个upstream,在这里定义后端的Web Server,能够是一个,也能够是多个。php

咱们用dig命令查看www.baidu.com域名对应的IP:html

能够看到两个IP,这两个IP均可以访问到www.baidu.com:nginx

能够看到两个IP返回的结果是同样的,有两个IP就能够走负载均衡了,配置过程以下:算法

#vim /usr/local/nginx/conf/vhost/load.confvim

写入以下内容:后端

upstream baidu_com
{
    ip_hash;
    server 220.181.57.216:80;
    server 123.125.115.110:80;
}

server
{
    listen 80;
    server_name www.baidu.com;

    location /
    {
        proxy_pass      http://baidu_com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

和简单的代理有所不一样,负载均衡多了一个upstream,在这里定义后端的Web Server,能够是一个,也能够是多个。其中ip_hash为负载均衡的算法,它表示根据IP地址把请求分到不一样的服务器上。下面进行测试:浏览器

能够看到,咱们的虚拟机也能够访问www.baidu.com了,这就是代理的做用。另外,nginx不支持代理https。安全


12.18 ssl原理

HTTPS,是一种加密的HTTP协议,若是HTTP通讯的数据包在传输过程当中被截获,咱们能够破译这些数据包里面的信息,这里面不乏一些用户名、密码、手机号等敏感信息。而若是使用HTTPS通讯,即便数据包被截获,咱们也没法破译里面的内容。服务器

HTTPS的通讯过程大体以下:负载均衡

(1)、浏览器发送一个HTTPS请求给服务器。

(2)、服务器要有一套数字证书,能够本身制做,也能够向组织申请,区别在于本身颁发的证书须要客户端验证经过,才能够继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。

(3)、服务器会把公钥传输给客户端。

(4)、客户端收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串,并用收到的公钥加密。

(5)、客户端把加密后的随机字符串传输给服务器。

(6)、服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串后,再用这串随机字符串加密传输的数据。

(7)、服务器把加密后的数据传输给客户端。

(8)、客户端收到数据后,再用本身的私钥(就是那个随机字符串)解密。

 


12.19 生产ssl密钥对

过程以下:

生成两个文件:公钥zhangjin.crt和私钥zhangjin.key。


12.20 Nginx配置ssl

新建配置文件:#vim /usr/local/nginx/conf/vhost/ssl.conf,并写入如下内容:

server
{
    listen 443;
    server_name zhangjin.com;
    index index.html index.php;
    root /data/nginx/zhangjin.com;

    ssl on;
    ssl_certificate zhangjin.crt;
    ssl_certificate_key zhangjin.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/nginx/aming.com$fastcgi_script_name;
    }
    access_log /tmp/1.log combined_realip;
}

保存文件后,检查配置是否有问题:

启动失败,说明当前的Nginx并不支持ssl,这是由于以前编译时,并无额外配置支持ssl的参数,解决的方法是从新编译一遍Nginx:

[root@zhangjin-120:/usr/local/nginx/conf]#cd /usr/local/src/nginx-1.12.1/
[root@zhangjin-120:/usr/local/src/nginx-1.12.1]#./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@zhangjin-120:/usr/local/src/nginx-1.12.1]#make & make install

编译完成后,再来检验一下:

没有问题,咱们再建立对应的目录和测试文件:

[root@zhangjin-120:~]#mkdir /data/nginx/zhangjin.com
[root@zhangjin-120:~]#echo "<?php phpinfo(); ?>" > /data/nginx/zhangjin.com/test.php
[root@zhangjin-120:~]#/etc/init.d/nginx restart
Restarting nginx (via systemctl):                          [  肯定  ]

而后编辑hosts文件,写入一行:

192.168.6.120 zhangjin.com

用浏览器访问https://zhangjin.com/test.php会提示不安全:


12.21 php-fpm的pool

Nginx能够配置多个虚拟主机,php-fpm一样也支持配置多个pool,每个pool能够监听一个端口,也能够监听一个socket。

咱们把php-fpm.conf配置文件作一个更改:

#vim php-fpm.conf

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf

保存后,再建立配置文件目录和子配置文件:

[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf
[root@zhangjin-120:/usr/local/php-fpm/etc]#
[root@zhangjin-120:/usr/local/php-fpm/etc]#mkdir /usr/local/php-fpm/etc/php-fpm.d
[root@zhangjin-120:/usr/local/php-fpm/etc]#cd /usr/local/php-fpm/etc/php-fpm.d/
[root@zhangjin-120:/usr/local/php-fpm/etc/php-fpm.d]#vim www.conf

[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
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

保存后,再编辑另外的配置文件:

[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf

[zhangjin]
listen = /tmp/zhangjin.sock
listen.mode = 666
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

保存,这样就有两个子配置文件了,也就是说有两个pool了,第一个pool监听了/tmp/www.sock,第二个pool监听了/tmp/zhangjin.sock。这样,就能够在Nginx不一样的虚拟主机中调用不一样的pool,从而达到相互隔离的目的,两个pool互不影响。下面来验证下配置是否有问题:

而后重启下php-fpm服务:

再来查看/tmp/目录下面的sock文件:


12.22 php-fpm慢执行日志

经过php-fpm的慢执行日志,咱们能够很是清晰地了解到PHP的脚本哪里执行时间长,它能够定位到具体的行。

开启和查看php-fpm的慢执行日志,操做步骤以下:

#vim /usr/local/php-fpm/etc/php-fpm.d/www.conf

第一行定义超时时间,即PHP的脚本执行时间只要超过1秒就会记录日志,第二行定义慢执行日志的路径和名字。


12.23 open_basedir

open_basedir的目的就是安全。httpd能够针对每一个虚拟主机设置一个open_basedir,php-fpm一样也能够针对不一样的pool设置不一样的open_basedir:

[root@zhangjin-120:/usr/local/php-fpm]#vim /usr/local/php-fpm/etc/php-fpm.d/zhangjin.conf

[zhangjin]
listen = /tmp/zhangjin.sock
listen.mode = 666
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_admin_value[open_basedir]=/data/www/:/tmp/ #在最后面加这一行内容

只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可使用open_basedir来物理隔离多个站点了,从而达到安全的目的。


12.24 php-fpm进程管理

#cat /usr/local/php-fpm/etc/php-fpm.d/www.conf  #查看配置文件内容
pm = dynamic   #定义php-fpm的子进程启动模式,dynamic为动态模式;一开始只启动少许的子进程,根据实际需求,动态地增长或减小子进程,最多不会超过pm.max_children定义的数值。另一种模式为static,这种模式下的子进程数量由pm.max_children决定,一次性启动这么多,不会减小也不会增长。
pm.max_children = 50   
pm.start_servers = 20  #针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。
pm.min_spare_servers = 5  #针对dynamic模式,它定义在空闲时段子进程数的最少数量,若是达到这个数值时,php-fpm服务会自动派生新的子进程。
pm.max_spare_servers = 35  #也是针对dynamic模式的,它定义在空闲时段子进程数的最大值,若是高于这个数值就开始清理空闲的子进程。
pm.max_requests = 500  #针对dynamic模式,它定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程中最多能够处理这么多请求,当达到这个数值时,它会自动退出。
相关文章
相关标签/搜索