第十二章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
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相关
 
 
负载均衡
 
 
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架构(下)的主要内容,如果未能解决你的问题,请参考以下文章

第十二章 LNMP架构

第十二章课下测试补交博客

高数(A)下 第十二章

第十二章 网络(下)

Linux系统:第十二章:AWS服务器X86架构安装配置Mysql与MongoDB

Linux系统:第十二章:AWS服务器X86架构安装配置Mysql与MongoDB