第十二章LNMP架构(下)
Posted lucky-lgx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二章LNMP架构(下)相关的知识,希望对你有一定的参考价值。
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文件为私钥
[[email protected] vhost]# cd /usr/local/nginx/conf
[[email protected] 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
[[email protected] conf]# openssl rsa -in tmp.key -out xin.key
Enter pass phrase for tmp.key:
writing RSA key
[[email protected] 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为公钥
[[email protected] 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=[email protected]
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
[[email protected] 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端口
[[email protected] 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/
[[email protected] ~]# vim /etc/hosts
[[email protected] ~]# 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
[[email protected] 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
[[email protected] 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
[[email protected] 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
[[email protected] php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
No input file specified.
[[email protected] 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目录下
[[email protected] php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
test slow logdone
[[email protected] 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
12.25扩展
ssl相关
负载均衡
nginx算法分析 https://blog.whsir.com/post-1482.html
root和alias
12.26课堂笔记
一、nginx虚拟主机配置
increase vhost/*.conf #是在nginx/conf/vhost目录下的
没设置default_server时,按文件名排序(ASCII码排序),第一个conf文件就是默认虚拟主机
二、防盗链
#valid_referers 配置referer白名单
#none 代表没有referer
#blocked 代表有referer但是防火墙或者是代理给去除了(就是搜索网站不加http://也能访问到网站)
三、Nginx访问控制
allow、deny只要匹配到就通过,后面的就不执行了
uri(域名后面的东西(路径或链接))
location ~ ... 等同于 if ( $uri ~ ... )
四、Nginx反向代理
#少了$host,客户端便访问不了需要的web服务网站,只会访问到web服务器的ip,通过ip访问会访问到网站默认虚拟主机
五、扩展
1、Nginx的四种flag
break与last区别
- 当rewrite规则在location{}外,break和last作用一样,遇到break或last后,其后续的rewrite/return语句不再执行。但后续有location{}的话,还会近一步执行location{}里面的语句,当然前提是请求必须要匹配该location。
- 当rewrite规则在location{}里,遇到break后,本location{}与其他location{}的所有rewrite/return规则都不再执行。
- 当rewrite规则在location{}里,遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次从头开始执行所有规则,哪个匹配执行哪个。
301(permanent)与302(redirect)区别
域名变化用301
域名没变化用302
2、location的优先级
location优先级
= 高于 ^~ 高于 *~高于 ~ 高于 /
3、502问题
1.配置错误
因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port
2.资源耗尽
lnmp架构在处理php时,nginx的直接调取后端的PHP-fpm的服务,如果nginx的的请求量偏高,我们又没有给PHP-fpm的配置足够的子进程,那么PHP-FPM就会资源耗尽,一旦资源耗尽nginx的找不到PHP-FPM就会出现502错误,
解决方案
去调整PHP-fpm.conf中的pm.max_children数值,使其增加,但是也不能无限增加,毕竟资源有限,一般4G内存机器如果跑PHP-FPM和nginx,不跑mysql可以设置为150,8G为300以此类推
3.除了上面的两种错误还有其他的原因,很少有,我们可以借助nginx的错误日志来进行排查vim / usr / local /nginx/logs/nginx_error.log我们也可以给日志定义级别vim / usr / local / nginx / conf / nginx.conf找到error_log,默认是crit最严谨的就行,也可以改成debug显示的信息最全面,但 是很容易撑爆我们的磁盘。
首先我们需要让浏览器进行访问
修改nginx的配置文件
[root @ wqslinux~] #vim / usr / local / nginx / conf / vhosts / 111.conf
server
{
listen 80;
服务器名称www.111.com ; //域名地址
索引index.html index.htm index.php;
root / data / www /;
location~ .php $ {
include fastcgi_params;
fastcgi_pass unix:/tmp/www.sock ; //修改袜子
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME / data / www $ fastcgi_script_name;
}
}
检查语法是否正常
[根@ wqslinux?]#的/ usr /本地/ nginx的/ sbin目录/ nginx的-t
重新加载配置文件
[根@ wqslinux?]#的/ usr /本地/ nginx的/ sbin目录/ nginx的-S重载
[ root @ wqslinux~]#/ etc / init.d /
nginx reload 检查nginx是那个用户跑的
[root @ wqslinux~] #ps aux | grep nginx
编辑php-fpm文件
我们要在这个php-fpm文件里面设置nginx的用户主,跟组这样才不会显示502
[root @ wqslinux~] #vim / usr / local / php / etc / php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = / usr / local / php / var / log / php-fpm.log
[www]
listen = /tmp/www.sock
user = php-fpm
group = php-fpm
listen.owner = nobody //定义属主
listen.group = nobody //定义属组
pm =动态
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
[root @ wqslinux~]#/ etc / init.d / php -fpm restart
ps:再补充一个,是近期很多同学遇到的问题
这种情况下,使用的是socket,版本高于5.4(含5.4)默认监听的socket文件权限是所有者只读,属组和其他用户没有任何权限。所以,nginx的启动用户(咱们配置的是没有)就没有办法去读这个socket文件,最终导致502,这个问题可以在nginx的错误日志中发现。解决办法很简单,上面给出的配置文件中就有避免这个问题的配置
.shop.owner =没人 //定义属主
listen.group = nobody //定义属组
这两个配置就是定义socket的属主和属组是谁。除了这个还有一种方法
listen.mode = 777
这样nobody也可以有读取权限了。
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文件为私钥
[[email protected] vhost]# cd /usr/local/nginx/conf
[[email protected] 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
[[email protected] conf]# openssl rsa -in tmp.key -out xin.key
Enter pass phrase for tmp.key:
writing RSA key
[[email protected] conf]# rm -f tmp.key
以上是关于第十二章LNMP架构(下)的主要内容,如果未能解决你的问题,请参考以下文章