12.16-12.24 nginx代理,负载均衡,ssl,php-fpm的pool,慢执行日志,open_basedir,php-fpm进程管理
nginx代理
下面我们以ask.apelearn.com为例。
vim /usr/local/nginx/conf/vhostproxy.conf
//输入以下内容
server
{
listen 80;
server_name ask.apelearn.com; //域名
location /
{
proxy_pass http://121.201.9.155/; //主机ip
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 -x127.0.0.1:80 ask.apelearn.com/robots.txt //可以成功的返回主机的内容
负载均衡
vim /usr/local/nginx/conf/vhost/load.conf
// 写入如下内容
upstream qq_com
{
ip_hash; //表示对应关系,让你每次都访问在同一个主机上
server 61.135.157.156:80;
server 125.39.240.113: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;
}
}
curl -x127.0.0.1:80 www.qq.com //这样也能正确的返回qq.com的值
ip_hash是负载均衡的算法。里面除了用户与服务器之间的对应关系,还会记录用户的session,以确保用户即使一段时间不活动,也依然在线的状态。
ssl
传统的网络协议是http协议,这个协议是没有加密的,信息以明文的方式传输。这存在一定的安全隐患,例如如果被黑客抓到了数据包,那么信息就泄露了。为了解决这个问题,可以使用https协议。https协议的加密主要是通过ssl工具。这样在网络上传输的信息就都是经过加密的。即使黑客截取到数据包,也没有办法解密。
cd /usr/local/nginx/conf //这是ssl文件保存的位置
openssl genrsa -des3 -out tmp.key 2048 //key文件为私钥
openssl rsa -in tmp.key -out aminglinux.key //转换key,取消密码
rm -f tmp.key //删除之前需要密码的文件
openssl req -new -key aminglinux.key -out aminglinux.csr //生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt //这里的aminglinux.crt为公钥
[root@cent01 conf]# ls //密钥文件如下
aminglinux.crt
aminglinux.csr
aminglinux.key
vim /usr/local/nginx/conf/vhost/ssl.conf
//加入如下内容
server
{
listen 443; //ssl用443端口
server_name aming.com;
index index.html index.php;
root /data/nginx/aming.com;
ssl on; //打开ssl
ssl_certificate aminglinux.crt; //公钥
ssl_certificate_key aminglinux.key; //私钥
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
-t && -s reload //发现报错,需要ssl。这时我们需要重新编译
./configure --help |grep ssl
搜索出--with-http_ssl_module
./configure --prefix=/usr/local/nginx --with-http_ssl_module
-t && -s reload //successful
[root@cent01 nginx-1.13.6]# service nginx restart //重启服务
在电脑上修改hosts后,访问https://aming.com 即可显示ssl的要求。
php-fpm的pool配置
nginx中可以开多个虚拟机,他们都需要php提供服务,所以为了保证每个不同虚拟机的性能,可以开启多个php-fpm的pool服务。每个pool监听一个端口。
方法1:
在 /usr/local/php-fpm/etc/php-fpm.conf中添加内容:
//两个模块命名为不同名字,监听的socket名字也不一样。在vhost相应的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
[aming]
listen = /tmp/aming.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
/usr/local/php-fpm/sbin/php-fpm -t //验证配置是否正确
service php-fpm restart //重启
ps aux |grep php-fpm //发现aming和www都出现了
方法2:
第一种方法显得不够整洁。可以类似于nginx添加虚拟机时的include语句。
在 /usr/local/php-fpm/etc/php-fpm.conf中添加内容:
include = etc/php-fpm.d/*.conf
然后删掉下面的配置语句。
mkdir /usr/local/php/etc/php-fpm.d/
cd /usr/local/php/etc/php-fpm.d/
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
vim aming.conf //内容如下
[aming]
listen = /tmp/aming.sock //监听的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
//检查vhost的conf文件,相应的更改监听sock
/usr/local/php-fpm/sbin/php-fpm -t //验证配置是否正确
service php-fpm restart //重启
ps aux |grep php-fpm //发现aming和www都出现了
慢执行日志
php-fpm有一个非常有用的功能,就是慢执行日志。可以非常有效的用来诊断系统的问题在哪里。尤其是当系统访问速度慢时。
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
//加入如下内容
request_slowlog_timeout = 1 //执行超过一秒的语句记录下来
slowlog = /usr/local/php-fpm/var/log/www-slow.log //日志存放目录
vim /data/wwwroot/test.com/sleep.php
//写入如下内容
<?php echo "test slow log";
sleep(2);
echo "done";
?>
[root@cent01 vhost]# curl -x127.0.0.1:80 test.com/sleep.php //测试
test slow logdone
[root@cent01 vhost]# cat /usr/local/php-fpm/var/log/www-slow.log //慢日志提示第三行花费的时间太多
[16-Nov-2017 20:20:39] [pool www] pid 14208
script_filename = /data/nginx/test.com/sleep.php
[0x00007f630f62f270] sleep() /data/nginx/test.com/sleep.php:3
当php文件遇到错误时,查错可以在/etc/init.d/php-fpm.ini 文件中打开display_error功能,这样错误就能直接在浏览器上显示。
open_basedir
可以直接在/usr/local/php-fpm/etc/php-fpm.d/www.conf中添加如下语句:
php_admin_value[open_basedir]=/data/nginx/aming.com:/tmp/
配置完成后重启服务 service php-fpm restart 或者 /etc/init.d/php-fpm restart
其中路径需要配置正确。否则会报错。