LNMP(三)Nginx负载均衡、ssl、php-fpm的pool及慢执行日志、open_basedir、php-fpm进程管理

 

任务列表:
12.17 Nginx负载均衡
12.18 ssl原理
12.19 生成ssl密钥对
12.20 Nginx配置ssl
12.21 php-fpm的pool
12.22 php-fpm慢执行日志
12.23 open_basedir
12.24 php-fpm进程管理

扩展
ssl相关php

http://www.javashuo.com/article/p-razjcjww-hu.html
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ca.md
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ssl.md
负载均衡
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md
nginx算法分析https://blog.whsir.com/post-1482.html
root和alias
http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/html

 

1 负载均衡:https://github.com/aminglinux/nginx/blob/master/proxy/lb.md前端

2 反向代理:相关缓存设置 https://github.com/aminglinux/nginx/blob/master/proxy/bu_ca.mdlinux

3.正向代理:https://github.com/aminglinux/nginx/blob/master/proxy/z_proxy.mdnginx

对于LNMP中的php-fom,掌握:

1 查php-fpm的slow log

2 配置php的错误日志(error_log log_error display_error error_reporting)

 

 

1、Nginx负载均衡git

负载均衡在服务端开发中算是一个比较重要的特性。由于Nginx除了做为常规的Web服务器外,还会被大规模的用于反向代理前端,由于Nginx的异步框架能够处理很大的并发请求,把这些并发请求hold住以后就能够分发给后台服务端(backend servers,也叫作服务池, 后面简称backend)来作复杂的计算、处理和响应,这种模式的好处是至关多的:隐藏业务主机更安全,节约了公网IP地址,而且在业务量增长的时候能够方便地扩容后台服务器。github

使用 dig 查看域名; 没有安装能够用yum安装此包:yum install -y bind-utilsweb

先建立简单的负载平衡模块,配置文件load.conf;算法

cd /usr/local/nginx/conf/vhostvim

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

upstream qq     //qq为模块名,自定义
{
ip_hash;     //负载均衡的算法
server 111.161.64.40:80; //默认端口为80,所以此处80能够省略
server 111.161.64.48:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq;            //与upstream相同
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

用curl -x测试www.qq.com,此时任意域名都会转到默认虚拟主机上;

[root@001 vhost]# curl -x127.0.0.1:80 www.qq.com
this is the default site.

检查load.conf配置文件语法,并加载

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

再curl -x测试www.qq.com,此时能够经过本身的机器能访问腾讯网站。说明代理成功

负载均衡扩展:
Nginx负载均衡(工做在七层“应用层”)功能主要是经过upstream模块实现,Nginx负载均衡默认对后端服务器有健康检测的能力,仅限于端口检测,在后端服务器比较少的状况下负载均衡能力表现突出。
Nginx的几种负载均衡算法:
一、轮询(默认):每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。
二、weight:指定轮询权重,weight值越大,分配到的概率就越高,主要用于后端每台服务器性能不均衡的状况。
三、ip_hash:每一个请求按访问IP的哈希结果分配,这样每一个访客固定访问一个后端服务器,能够有效的解决动态网页存在的session共享问题。
四、fair(第三方):更智能的一个负载均衡算法,此算法能够根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。若是想要使用此调度算法,须要Nginx的upstream_fair模块。
五、url_hash(第三方):按访问URL的哈希结果来分配请求,使每一个URL定向到同一台后端服务器,能够进一步提升后端缓存服务器的效率。若是想要使用此调度算法,须要Nginx的hash软件包。
在upstream模块中,能够经过server命令指定后端服务器的IP地址和端口,同时还能够设置每台后端服务器在负载均衡调度中的状态,经常使用的状态有如下几种:
一、down:表示当前server暂时不参与负载均衡。
二、backup:预留的备份机,当其余全部非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻。
三、max_fails:容许请求的失败次数,默认为1,配合fail_timeout一块儿使用
四、fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s(某个server链接失败了max_fails次,则nginx会认为该server不工做了。同时,在接下来的 fail_timeout时间内,nginx再也不将请求分发给失效的server。)
一个负载均衡器的名称为whsirserver,这个名称能够本身定义,在后面proxy_pass直接调用便可。
proxy_next_upstream参数用来定义故障转移策略,当后端服务器节点返回500、502和执行超时等错误时,自动将请求转发到upstream负载均衡器中的另外一台服务器,实现故障转移。

2、ssl原理

浏览器发送一个https的请求给服务器; 
服务器要有一套数字证书,能够本身制做,也能够向组织申请,区别就是本身颁发的证书须要客户端验证经过,才能够继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥;
服务器会把公钥传输给客户端;
客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
客户端把加密后的随机字符串传输给服务器;
服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串经过某种算法混合在一块儿,这样除非知道私钥,不然没法获取数据内容);
服务器把加密后的数据传输给客户端; 
客户端收到数据后,再用本身的私钥也就是那个随机字符串解密;

3、生成SSL密钥对

cd /usr/local/nginx/conf/      公钥和私钥放到该目录下

生成key即“私钥”:openssl genrsa

rpm -qf `which openssl`     //查看openssl是哪一个安装包,没有此命令,则安装

openssl genrsa -des3 -out tmp.key 2048 //生成私钥tmp.key,长度为2048

openssl rsa -in tmp.key -out tobe.key     //转换key,取消密码,in指定哪一个密钥转换,指定输出

rm -f tmp.key //由于两个同样,则删除tmp.key

本身设置一个证书;

openssl req -new -key tobe.key -out tobe.csr        //生成证书请求文件,须要拿这个文件和私钥一块儿生产公钥文件

openssl x509 -req -days 365 -in tobe.csr -signkey tobe.key -out tobe.crt        //用私钥和刚才生成的文件,一块儿生成公钥

查看生成的tobelinux的证书文件,其实购买SSL证书主要获得下面两个文件,有了这两个文件就能够配置nginx;

tobe.crt //公钥

tobe.csr

tobe.key //私钥

4、Nginx配置ssl

mkdir /data/wwwroot/tobe.com  建立目录

vim /usr/local/nginx/conf/vhost/ssl.conf        //加入以下内容

server

{

listen 443;    

server_name tobe.com;

index index.html index.php;

root /data/wwwroot/tobe.com;

ssl on;        开启ssl,支持https

ssl_certificate tobe.crt;    指定公钥
    
ssl_certificate_key tobe.key;        指定私钥

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    协议,三种都配置

}

编辑完ssl配置文件,此时检查语法,发现当前Nginx并不支持SSL,由于当时辑Nginx编译时并无配置支持SSL的参数

/usr/local/nginx/sbin/nginx -V         //查看nginx版本号

./configure --help |grep -i ssl //查找ssl

配置ssl模块,而后编译、安装

./configure --prefix=/usr/local/nginx --with-http_ssl_module
make & make install

检查语法、重启服务,查看监听端口,此时会出现443端口;

测试

cd /data/wwwroot/tobe.com/

vim index.html //建立一个测试网页

curl -x127.0.0.1:443 https://tobe.com/ //要是这样,是访问不到的;

vim /etc/hosts //配置hosts

此时能够直接:curl https://tobe.com/  ;可是证书是我本身颁发的,不合法;

curl: (60) Peer's certificate issuer has been marked as not trusted by the user.

More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"

of Certificate Authority (CA) public keys (CA certs). If the default

bundle file isn't adequate, you can specify an alternate file

using the --cacert option.

If this HTTPS server uses a certificate signed by a CA represented in

the bundle, the certificate verification probably failed due to a

problem with the certificate (it might be expired, or the name might

not match the domain name in the URL).

If you'd like to turn off curl's verification of the certificate, use

the -k (or --insecure) option.

此时在windows下浏览器测试;

假如在浏览器:https://tobe.com 此时无反应,则须要清除规则;或者增长一个443的规则

iptables -F

5、php-fpm的pool

Nginx能够配置多个虚拟主机,php-fpm配置文件php-fpm.conf能够设置多个pool,每一个pool能够监听一个端口,在其中一个pool资源耗尽,会致使其余站点没法访问资源,报502错误。有必要把站点进行分离,分别使用单独的pool。

/usr/local/php-fpm/etc/

在php-fpm配置文件中添加一个tobe.com的池子;

vim php-fpm.conf

[tobe.com]
listen = /tmp/tobe.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-fpm

/usr/local/nginx/sbin/nginx -t
/etc/init.d/php-fpm reload

查看进程,此时 有两个池子,其中一个就是tobe.com

虚拟主机里面设置

cd /usr/local/nginx/conf/vhost

vim aaa.com.conf

location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/tobe.sock; //定义池子
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}

cd /usr/local/php-fpm/etc/

vim php-fpm.conf //编辑php-fpm主配置文件

global中增长此行,删除后面的池子,至关于一个模块名,并把以前的内容保存

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

mkdir php-fpm.d     //根据php-fpm配置文件建立相应目录

进入目录,建立vim www.conf,把以前删除的www粘贴进来

建立tobe.com.conf,粘贴以前的tobe.com内容

查看php-fpm.conf内容,只有三行,其他的两个池子,被分红两个文件;

检查语法,并重启服务

/usr/local/nginx/sbin/nginx -t

 /etc/init.d/php-fpm reload

在查看进程,一样有两个池子,顺序改变

6、php-fpm慢执行日志

php网站,建议使用lnmp架构的一个好处就是查看“慢日志”,当咱们的客户或者manager发现站点访问速度点慢,若是所有的负载均不是很高,一切正常仍是慢,那惟一的办法就是检查“慢日志”,慢日志会向咱们详细的展现某个页面的多少行代码在执行过程当中超过了咱们设定的阀值!

针对www.conf

在www.conf配置文件中,最后两行加上以下内容;

request_slowlog_timeout = 1         超过1秒就记录,能够写成2秒,1-2之间

slowlog = /usr/local/php-fpm/var/log/www-slow.log        //定义日志内容的目录

重启服务后,查看指定的目录是否生成 www_slow.log 日志

/usr/local/php-fpm/sbin/php-fpm -t

/etc/init.d/php-fpm reload

 ls /usr/local/php-fpm/var/log/

模拟一个慢执行的php

vim /data/wwwroot/test.com/sleep.php  建立一个sleep.php

<?php 
echo "test slow log";
sleep(2);
echo “done”;
?>

curl -x127.0.0.1:80 test.com/sleep.php         //执行成功,返回test slow log

cat /usr/local/php-fpm/var/log/www-slow.log //查看慢日志

 

提示第三行报错,超过1秒

7、open_basedir

若是一个server有不少个web服务,那么不建议直接把open_basedir直接配置在php.ini中了。Apache能够针对每一个虚拟主机设置一个Open_basedir,php-fpm一样也能够针对不一样的pool设置不一样的Open_basedir

再www.conf配置文件中,添加:php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/,以下

此处须要注意:目录下对应的是test.com;由于www池子,也就是www.conf对应的是test.com这个虚拟主机

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock; //注意:php-fcgi.sock

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;

}

编辑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
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log
php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/        //添加此行,限制在test.com和、tmp目录下

重启服务后,测试成功

 curl -x127.0.0.1:80 test.com/3.php -I

参考笔记:https://www.jb51.net/article/110264.htm

8、php-fpm进程管理

pm = dynamic //动态进程管理,也能够是static 

pm.max_children = 50 //最大子进程数,ps aux能够查看

pm.start_servers = 20 //启动服务时会启动的进程数

pm.min_spare_servers = 5 //定义在空闲时段,子进程数的最少数量,若是达到这个数值时,php-fpm服务会自动派生新的子进程。 

pm.max_spare_servers = 35 //定义在空闲时段,子进程数的最大值,若是高于这个数值,php-fpm服务就开始清理空闲的子进程。

pm.max_requests = 500 //定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多能够处理这么多请求,当达到这个数值时,它会自动退出。

rlimit_files = 1024 :设置文件打开描述符的rlimit限制. 默认值: 系统定义值 系统默承认打开句柄是1024,可以使用 ulimit -n查看,ulimit -n 2048修改(临时修改)。
相关文章
相关标签/搜索