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进程管理
12.25扩展
12.17 Nginx负载均衡
编辑配置虚拟主机文件
• vim /usr/local/nginx/conf/vhost/load.conf
# 写入如下内容:
upstream qq_com
#upstream名字自定义
{
ip_hash;
#ip_hash这一行的目的是让同一个用户始终保持在同一台机器上
server 61.135.157.156:80;
server 125.39.240.113:80;
}
#server如果不指定端口号,默认80端口
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
#这里写的是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;
}
}
# upstream来指定多个web server
yum install -y bind-utils #安装dig命令
#dig命令可以查看域名解析到什么ip地址
用法:dig 域名
dig qq.com
#nginx不支持代理https(端口号443)
12.18 ssl原理
https与http的区别:
https通信是加密的,防止数据传输过程中被泄露
SSL工作流程:
1、浏览器发送一个https的请求给服务器;
2、服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
3、 服务器会把公钥传输给客户端;
4、 客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
5、客户端把加密后的随机字符串传输给服务器;
6、 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
7、服务器把加密后的数据传输给客户端;
8、 客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
12.19 生成ssl密钥对
rpm -qf `which openssl` #查看openssl是什么包安装的
一、生成私钥,设置密码,保存到/usr/local/nginx/conf目录下
• cd /usr/local/nginx/conf
• openssl genrsa -des3 -out tmp.key 2048
#genrsa表示类型为rsa,tmp.key是私钥的名字,2048是密钥长度
#key文件为私钥
[root@xinlinux-03 vhost]# cd /usr/local/nginx/conf
[root@xinlinux-03 conf]# openssl genrsa -des3 -out tmp.key 2048
Generating RSA private key, 2048 bit long modulus
.+++
..................................................................+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key:
Verifying - Enter pass phrase for tmp.key:
二、转换key,取消密码,删掉原来key
• openssl rsa -in tmp.key -out xin.key
#-in 指定密钥转换文件,-out 指定输出的文件
• rm -f tmp.key
[root@xinlinux-03 conf]# openssl rsa -in tmp.key -out xin.key
Enter pass phrase for tmp.key:
writing RSA key
[root@xinlinux-03 conf]# rm -f tmp.key
三、生成证书请求文件
• openssl req -new -key xin.key -out xin.csr
四、通过请求文件和私钥一起生产公钥文件
• openssl x509 -req -days 365 -in xin.csr -signkey xin.key -out xin.crt
# 这里的xin.crt为公钥
[root@xinlinux-03 conf]# openssl x509 -req -days 365 -in xin.csr -signkey xin.key-out xin.crt
Signature ok
subject=/C=12/ST=Guangzhou/L=Tianhe/O=aiqiyi/emailAddress=1057259293@qq.com
Getting Private key
12.20 Nginx配置ssl
一、新建ssl.conf,配置ssl
• vim /usr/local/nginx/conf/vhost/ssl.conf
#加入如下内容:!v
server
{
listen 443;
server_name xin.com;
index index.html index.php;
root /data/wwwroot/xin.com;
ssl on;
ssl_certificate xin.crt;
ssl_certificate_key xin.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
二、检查语法并重载配置文件
•/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
#若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module,然后make&&make install
[root@xinlinux-03 conf]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
./configure --prefix=/usr/local/nginx/ --with-http_ssl_module
make&&make install
netstat -lntp #查看是否监听443端口
[root@xinlinux-03 nginx-1.8.0]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11850/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 769/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 919/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 11850/nginx: master
三、创建网站目录
• mkdir /data/wwwroot/xin.com
四、测试
• echo "This is ssl test page." >/data/wwwroot/xin.com/index.html
• 编辑hosts,增加127.0.0.1 xin.com
vim /etc/hosts
• curl https://xin.com/
[root@xinlinux-03 ~]# vim /etc/hosts
[root@xinlinux-03 ~]# curl https://xin.com/
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
#出现证书不可信任提示,因为这证书是不合法的,自己做的
编辑windows的hosts,增加192.168.233.150 xin.com
打开浏览器输入:https://xin.com
#如果访问不了,可能是防火墙问题
12.21 php-fpm的pool
目的:使用单独不同的pool将所有站点隔离开,防止其中一个站点出现问题从而导致其他站点也出现问题
#可以在php-fpm.conf主配置文件内建立多个pool,也可单独pool单独一个conf文件
• vim /usr/local/php-fpm/etc/php-fpm.conf
#在[global]部分增加如下内容:
• include = etc/php-fpm.d/*.conf
创建/php-fpm.d/目录
• mkdir /usr/local/php-fpm/etc/php-fpm.d/
• cd /usr/local/php-fpm/etc/php-fpm.d/
配置www.conf的pool
• vim www.conf
#内容如下:
[www]
listen = /tmp/www.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
•编辑xin.conf的pool
• vim xin.conf
#内容如下
[xin]
listen = /tmp/xin.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/php-fpm/sbin/php-fpm –t
• /etc/init.d/php-fpm restart
[root@xinlinux-03 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[27-Sep-2018 10:05:23] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@xinlinux-03 php-fpm.d]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
ps aux |grep php-fpm #查看php-fpm的pool情况(在最右侧)
需要使用pool的话,只需要在网站server配置文件修改为pool对应的sock文件,即可将多个网站隔离开
12.22 php-fpm慢执行日志
目的:搭建php网站用LNMP时,可以分析php-fpm慢执行日志,可以找出网站访问变慢的原因
一、编辑www.conf配置文件
•vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#加入如下内容
request_slowlog_timeout = 1
#超过一秒就会纪录日志(一般都会设置1~2秒之间)
slowlog = /usr/local/php-fpm/var/log/www-slow.log
二、 配置nginx的虚拟主机test.com.conf,(因为www.conf的sock文件是www.sock)
把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock
三、检查语法并重载nginx服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
四、测试
• vim /data/wwwroot/test.com/sleep.php
#写入如下内容
<?php
echo "test slow log";
sleep(2);
echo "done";
?>
#休眠2秒钟
• curl -x127.0.0.1:80 test.com/sleep.php
• cat /usr/local/php-fpm/var/log/www-slow.log
[root@xinlinux-03 php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log
[27-Sep-2018 10:33:23] [pool www] pid 12132
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007f411ea4f270] sleep() /data/wwwroot/test.com/sleep.php:3
#显示是哪个文件慢,第几行慢;这里是sleep.php的第三行慢,超过一秒都会纪录
12.23 open_basedir
#通过pool限定网站目录
适用定义位置:Apache虚拟主机配置文件或者php-fpm配置文件
#open_basedir后面接的是要限定的网站目录路径,路径不对就访问不了
• vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#加入如下内容
php_admin_value[open_basedir]=/data/wwwroot/www.com:/tmp/
• 创建测试php脚本,进行测试
curl -x127.0.0.1:80 test.com/sleep.php -I
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.8.0
Date: Thu, 27 Sep 2018 02:54:10 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.32
#因为basedir不对,现在将basedir改为test目录下
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
test slow logdone
[root@xinlinux-03 php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 27 Sep 2018 02:56:28 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.32
两种查错方法:
第一种:开启php-fpm.ini文件的display_error,通过curl后显示的错误信息查找
vim /usr/local/php-fpm/etc/php.ini
display_errors = on
第二种:通过查看错误日志排错
1、配置错误日志
vim /usr/local/php-fpm/etc/php.ini
指定错误日志位置
error_log=/usr/local/php-fpm/var/log/php_errors.log
指定日志级别
error_reporting = E_ALL
2、然后检查语法并重载配置
/usr/local/php/sbin/php-fpm –t
/etc/init.d/php-fpm reload
3、再次测试
4、 查看错误日志
12.24 php-fpm进程管理
#配置pool的内容
•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
#定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
• pm.max_requests = 500
#定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。
#如果是pm=static时,只有两句会生效,其他的都不会生效
•pm = static
• pm.max_children = 50