一、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,写入如下的内容:
[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服务,访问测试