0518LNMP架构(三)
一、Nginx负载均衡
负载均衡在服务端开发中算是一个比较重要的特性。因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求,把这些并发请求hold住之后就可以分发给后台服务端(backend servers,也叫做服务池, 后面简称backend)来做复杂的计算、处理和响应,这种模式的好处是相当多的:隐藏业务主机更安全,节约了公网IP地址,并且在业务量增加的时候可以方便地扩容后台服务器。
1、安装查看dig域名的命令包
yum install -y bind-utils
2、使用dig qq.com反馈回来两个IP
3、用这两个Ip做负载均衡
(1)切换目录
cd /usr/local/nginx/conf/vhost
(2)创建配置文件
vim load.conf
添加如下内容:
upstream qq_com //qq_com为模块名
{
ip_hash; //负载均衡的算法
server 111.161.64.48:80; //默认端口为80,因此此处80可以省略
server 111.161.64.40:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_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;
}
}
(3)使用curl -x测试www.qq.com,此时任意域名都会转到默认虚拟主机上
(4)检查load.conf配置文件语法,并加载
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
(5)再次访问curl -x测试www.qq.com, 返回了qq.com的主页源码
负载均衡扩展:
Nginx负载均衡(工作在七层“应用层”)功能主要是通过upstream模块实现,Nginx负载均衡默认对后端服务器有健康检测的能力,仅限于端口检测,在后端服务器比较少的情况下负载均衡能力表现突出。
Nginx的几种负载均衡算法:
1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。
2、weight:指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
3、ip_hash:每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。
4、fair(第三方):更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。
5、url_hash(第三方):按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。
在upstream模块中,可以通过server命令指定后端服务器的IP地址和端口,同时还可以设置每台后端服务器在负载均衡调度中的状态,常用的状态有以下几种:
1、down:表示当前server暂时不参与负载均衡。
2、backup:预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻。
3、max_fails:允许请求的失败次数,默认为1,配合fail_timeout一起使用
4、fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s(某个server连接失败了max_fails次,则nginx会认为该server不工作了。同时,在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。)
一个负载均衡器的名称为whsirserver,这个名称可以自己定义,在后面proxy_pass直接调用即可。
proxy_next_upstream参数用来定义故障转移策略,当后端服务器节点返回500、502和执行超时等错误时,自动将请求转发到upstream负载均衡器中的另一台服务器,实现故障转移。
二、Nginx ssh配置
1、工作原理
(1)浏览器发送一个https的请求给服务器;
(2)服务器要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥;
(3)服务器会把公钥传输给客户端;
(4)客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
客户端把加密后的随机字符串传输给服务器;
(5)服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
(6)服务器把加密后的数据传输给客户端;
(7)客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
2、生产ssl密钥对
(1)生成key即“私钥”:openssl genrsa
cd /usr/local/nginx/conf/
rpm -qf `which openssl` //查看openssl是哪个安装包,没有此命令,则安装
openssl genrsa -des3 -out tmp.key 2048 //生成私钥tmp.key,长度为2048
openssl rsa -in tmp.key -out luolinux.key //把tmp.key改为luolinux.key
rm -f tmp.key //因为两个一样,则删除tmp.key
(2)自己设置一个证书;
openssl req -new -key luolinux.key -out luolinux.csr //生成证书的请求文件,以下均自行填写
(3)用csr文件和最早生成的私钥,一起生成公钥
openssl x509 -req -days 365 -in luolinux.csr -signkey luolinux.key -out luolinux.crt
(4)查看生成的luolinux的证书文件,其实购买SSL证书主要得到下面两个文件,有了这两个文件就可以配置nginx;
luolinux.crt //公钥
luolinux.key //私钥
3、Nginx配置ssl
cd vhost/
(1)创建luo.com
mkdir /data/wwwroot/luo.com
(2)新建配置文件ssl.conf
vim /usr/local/nginx/conf/vhost/ssl.conf
添加如下配置内容:
server
{
listen 443;
server_name ying.com;
index index.html index.php;
root /data/wwwroot/ying.com;
ssl on;
ssl_certificate yinglinux.crt;
ssl_certificate_key yinglinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
(3)检测语法报错,是由于当前Nginx并不支持SSL,因为当时辑Nginx编译时并没有配置支持SSL的参数;需要重新编译
(4)查看nginx版本号
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
(5)切换至源码包目录
cd /usr/local/src/nginx-1.14.2
(6)查找ssl,需要添加--with-http_ssl_module 配置
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make
make install
(7)检查语法、重启服务,查看监听端口,此时会出现443端口;
(8)cd /data/wwwroot/luo.com/ 创建测试文件
vim index.html //创建一个测试网页
curl -x127.0.0.1:443 https://luo.com/ //直接访问是访问不到的,需要配置hosts文件
vim /etc/hosts
127.0.0.1 luo.com//添加此行
curl https://luo.com/ //再次访问
因为是自己给自己颁发的证书,并不合法,可在沃通购买证书。
三、php-fpm相关设置
1. php-fpm的pool
Nginx可以配置多个虚拟主机,php-fpm配置文件php-fpm.conf可以设置多个pool,每个pool可以监听一个端口,在其中一个pool资源耗尽,会导致其他站点无法访问资源,报502错误。有必要把站点进行分离,分别使用单独的pool。
(1)在php-fpm配置文件中添加一个luo.com的池子
cd /usr/local/php-fpm/etc/
vim php-fpm.conf
检测语法错误并重启
/usr/local/php-fpm/sbin/php-fpm -t
/etc/init.d/php-fpm reload
(2)查看进程,此时有两个池子,其中一个就是luo.com
ps aux |grep php-fpm
(3)虚拟主机里面设置
vim aaa.com.conf
添加pool:
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/luo.sock; //定义池子
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}
}
(4)cd /usr/local/php-fpm/etc/
Ls
vim php-fpm.conf //编辑php-fpm主配置文件,添加行include = etc/php-fpm.d/*.conf,并删除下面的pool
(5)mkdir php-fpm.d //根据php-fpm配置文件创建相应目录
cd php-fpm.d/
vim www.conf //创建 www.conf 配置文件,就相当于之前的www池子
[www]
listen = /tmp/php-fcgi.sock
#listen =127.0.0.1:9000
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
(6)vim luo.com.conf
创建 luo.com.conf 配置文件,就相当于之前的一个池子
[luo.com]
listen = /tmp/luo.sock
#listen =127.0.0.1:9000
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
(7)cat ../php-fpm.conf
查看php-fpm.conf内容,只有三行,其余的两个池子,被分成两个文件;
(8)检查语法,并重启服务
/usr/local/php-fpm/sbin/php-fpm -t
/etc/init.d/php-fpm reload
(9)再次查看进程,同样有两个池子;
ps aux |grep php-fpm
2. php-fpm慢执行日志
php网站,建议使用lnmp架构的一个好处就是查看“慢日志”,为什么这么说呢?当我们的客户或者manager发现站点访问速度点慢,如果全部的负载均不是很高,一切正常还是慢,怎么办?那唯一的办法就是检查“慢日志”,慢日志会向我们详细的展示某个页面的多少行代码在执行过程中超过了我们设定的阀值!
(1)在www.conf配置文件中,加上最后两行内容;
vim www.conf
request_slowlog_timeout = 2 //超过2秒就记录
slowlog = /usr/local/php-fpm/var/log/www_slow.log //定义日志内容的目录
(2)重启服务后,查看指定的目录是不是生成 www_slow.log 日志
/usr/local/php-fpm/sbin/php-fpm -t
/etc/init.d/php-fpm reload
ls /usr/local/php-fpm/var/log
(3)现在模拟超过2秒的试验
vim /data/wwwroot/test.com/sleep.php
添加:
<?php
echo "test slowlog!";
sleep(3); //第三行,休眠3秒
echo "done";
?>
(4)curl -x127.0.0.1:80 test.com/sleep.php 访问成功
(5)查看慢日志
cat /usr/local/php-fpm/var/log/www_slow.log
[19-May-2019 23:22:10] [pool www] pid 10517
script_filename = /data/wwwroot/test.com/sleep.php //此文件慢
[0x00007ff63e7eb2f8] sleep() /data/wwwroot/test.com/sleep.php:3 //此文件的第三行慢
3. open_basedir
如果一个server有很多个web服务,那么不建议直接把open_basedir直接配置在php.ini中了。Appache可以针对每个虚拟主机设置一个Open_basedir,php-fpm同样也可以针对不同的pool设置不同的Open_basedir.
(1)编辑www.conf配置文件
vim www.conf
在末尾添加限制在test.com和、tmp目录下:
php_admin_value[open_basedir]=/data/wwwroot/test.com/:/tmp/
(2)重启服务后,测试成功
/etc/init.d/php-fpm restart
curl -x127.0.0.1:80 test.com/sleep.php
补充:vi /usr/local/php-fpm/etc/php.ini 正常线上情况下,display_errors需要off掉,不能让别人看到浏览器的错误信息,而是把错误信息记录在服务器的某个文件里。可找syslog,下面添加error_log = /usr/local/php.fpm/var/log/php_errors.log,同时查找error_reporting =,定义为所有E_ALL,touch /usr/local/php-fpm/var/log/php_errors.log添加错误日志格式,并赋予777权限,重启。
4、php-fpm进程管理
[www]
listen = /tmp/php-fcgi.sock
#listen =127.0.0.1:9000
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 = 2
配置文件说明:
- pm = dynamic:动态进程管理,也可以是static
- pm.max_children = 50 : 最大子进程数
- pm.start_servers = 20 : 启动服务时会启动的进程数
- pm.min_spare_servers = 5 : 定义在空闲时段,子进程数的最少值,如果达到这个值,php-fpm服务会自动派生新的子进程
- pm.max_spare_servers = 35 : 定义在空闲时段,子进程数的最大值,如果高于这个值,php-fpm服务会清理空闲的子进程
- pm.max_requests = 500 :定义一个字进程最多可以处理多少个进程,这里设置成500,也就是说在一个php-fpm的子进程最多可以处理500个,若达到这个数值时,它就会自动退出。
rlimit_files = 1024 :设置文件打开描述符的rlimit限制. 默认值: 系统定义值 系统默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改(临时修改)。