21:LNMP功能配置-下

LNMP功能配置-下

Nginx负载均衡

Nginx负载均衡需要用到upstream模块

upstream模块用于定义多个web server

通过算法将访问请求分发到不同的web server

配置方式:

这里以qq.com为例,先使用dig命令获取qq.com的服务器ip

[root@server-lnmp ~]> dig qq.com | grep -A3 -i 'answer section'
;; ANSWER SECTION:
qq.com.         336 IN  A   58.60.9.21
qq.com.         336 IN  A   180.163.26.39
qq.com.         336 IN  A   59.37.96.63

然后在/usr/local/nginx/conf/vhost/目录下创建一个文件qq_com.conf,写入如下的内容

upstream qq_com      ##baidu_com只是代表服务器组的名称,可以随意定义,用于proxy_pass调用
{
    ip_hash;     ##ip_hash算法,将同一个源ip的访问请求分发给同一个server,避免数据混乱
    server 59.37.96.63:80;   #定义后端的server ip:port
    server 180.163.26.39:80;    #定义后端的server ip:port
    server 59.37.96.6380
}
server
{
    listen 80;                  #监听端口
    server_name www.qq.com qq.com;     #虚拟主机域名
    location /
    {
        proxy_pass      http://qq_com;   #proxy_pass  调用upstream baidu_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;
    }
}

配置完检测语法,重新加载配置

测试访问效果

使用curl将www.qq.com解析到127.0.0.1

[root@server-lnmp ~]> curl   -x127.0.0.1:80 www.qq.com
#得到的就是qq.com网页的源代码了。

浏览器访问效果

在Windows的hosts文件中写一条记录 10.1.1.28 www.qq.com qq.com

使用ping命令检查

C:\Users\LongGe>ping www.qq.com

正在 Ping www.baidu.com [10.1.1.28] 具有 32 字节的数据:
来自 10.1.1.28 的回复: 字节=32 时间<1ms TTL=64


#解析到的是10.1.1.28这个ip

然后使用浏览器访问www.qq.com

Nginx配置SSL

SSL工作原理

1:  浏览器发送一个https的请求给服务器;

2:  服务器要有一套数字证书,可以自己制作,也可以向组织申请,
    区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,
    而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;

3:服务器会把公钥传输给客户端;

4:客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;

5:客户端把加密后的随机字符串传输给服务器;

6:服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),
   获取到这一串随机数后,再用这串随机字符串加密传输的数据
  (该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);

7:服务器把加密后的数据传输给客户端;

8:客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;

参考:数字证书原理

Nginx配置SSL证书

自己生成SSL证书

实际工作环境都是在证书颁发机构购买SSL证书,这样的证书会自动通过浏览器的信任

我们自己生成的SSL证书是不会自动通过浏览器的信任的,浏览器会弹出相应的提示。

比如https://www.12306.cn这个网站就是自己颁发的SSL证书,不被浏览器信任的。

首先进入nginx的配置文件存放目录 /usr/local/nginx/conf

[root@server-lnmp ~]> cd /usr/local/nginx/conf/
[root@server-lnmp conf]> pwd
/usr/local/nginx/conf

然后需要用到命令openssl,如果没有这个命令,需要yum install openssl即可

[root@server-lnmp 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:

genrsa表示生成rsa类型的私钥文件,-des3表示使用des3加密算法

-out 指定生成的私钥文件名,2048表示加密算法的长度为2048位

生成私钥文件必须输入两次密码,

但是有密码的私钥比较麻烦,下面就来取消私钥文件的密码。

[root@server-lnmp conf]> openssl rsa -in tmp.key -out server-lnmp.key
Enter pass phrase for tmp.key:
writing RSA key
[root@server-lnmp conf]> ls -dl server-lnmp.key 
-rw-r--r--. 1 root root 1675 Jul  8 20:25 server-lnmp.key


##这样就得到了一个没有密码的私钥文件

生成证书请求文件,需要拿证书请求文件和没有密码私钥一起生产公钥文件

[root@server-lnmp conf]> openssl req -new -key server-lnmp.key -out server-lnmp.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,

If you enter '.', the field will be left blank.
-----

Country Name (2 letter code) [XX]:CN                        #国家名
State or Province Name (full name) []:SC                    #省份
Locality Name (eg, city) [Default City]:CD                  #城市
Organization Name (eg, company) [Default Company Ltd]:Test  #组织名称
Organizational Unit Name (eg, section) []:Test              #组织单位
Common Name (eg, your name or your server's hostname) []:test.com  #一般填服务器的域名
Email Address []:test@test.com   邮箱         

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:      #密码不填写    
An optional company name []:  #密码不填写

生成公钥文件

[root@server-lnmp conf]> openssl x509 -req -days 365 -in server-lnmp.csr -signkey server-lnmp.key -out server-lnmp.crt
Signature ok
subject=/C=CN/ST=SC/L=CD/O=Test/OU=Test/CN=Test/emailAddress=test@test.com
Getting Private key


# x509 代表生成的x509的证书


# -req 证书请求,用于生成证书文件


# -days 证书的有效期,365表示一年


# -in 指定证书请求文件,


# -signkey 指定私钥文件


# -out 指定生成的公钥文件名

查看刚才生成的文件

[root@server-lnmp conf]> ls server-lnmp.*
server-lnmp.crt  server-lnmp.csr  server-lnmp.key

添加nginx的SSL配置文件

在/usr/local/nginx/conf/vhost/目录下创建一个文件ssl_test.conf,写入下面的配置内容

server
{
   listen 443;
   server_name test.com www.test.com;
   index index.html index.php;
   root /data/wwwroot/www.test.com;
   ssl on;    #启用ssl功能
   ssl_certificate server-lnmp.crt;   #指定公钥文件
   ssl_certificate_key server-lnmp.key;  #指定私钥文件
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   location ~ \.php$
   {
       include fastcgi_params;
       fastcgi_pass 10.1.1.28:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.test.com$fastcgi_script_name;
   }
}

如果出现错误:nginx: [emerg] unknown directive “ssl”

需要重新编译安装nginx 加上–with-http_ssl_module

[root@server-lnmp conf]> cd /usr/local/src/nginx-1.12.1
[root@server-lnmp nginx-1.12.1]> ./configure --prefix=/usr/local/nginx --with-http_ssl_module


#检查错误

[root@server-lnmp nginx-1.12.1]> echo $?
0

[root@server-lnmp nginx-1.12.1]> make && make install

然后重新检测语法错误, 重载配置文件

[root@server-lnmp nginx-1.12.1]> nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server-lnmp nginx-1.12.1]> nginx -s reload

查看443端口是否监听

[root@server-lnmp vhost]> netstat -lntp | grep 443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      1330/nginx: master 

测试访问

curl 访问本地的https需要添加hosts

echo '127.0.0.1 www.test.com test.com' >> /etc/hosts

curl测试访问


##  如果直接访问会提示证书不被信任。

[root@server-lnmp vhost]> curl  https://test.com
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html
(省略...)


#使用 -k 选项忽略证书检查就可以访问了

[root@server-lnmp vhost]> curl -k https://test.com   
<h1>This is test page</h1>

浏览器访问

同样需要修改hosts 将test.com和www.test.com 解析到nginx服务器的ip上 我这里是 10.1.1.28

然后用浏览器访问https://www.test.com
这里会出现一个安全提示

然后点高级 > 继续访问就可以正常访问网页了

php-fpm的pool

php-fpm也可以配置类似nginx虚拟主机的pool

可以将每个pool做成一个单独的配置文件

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
    #使用文件描述符数量,
    #系统每打开一个文件就会消耗一个文件描述符
    #当文件描述符消耗完了就会报错

文件描述符参考:最大文件描述符详解

配置方式

在/usr/local/php-fpm/etc/php-fpm.conf 配置文件的 [global] 部分添加一行配置

并删除[www]部分的内容

/usr/local/php-fpm/etc/php-fpm.conf 文件修改后的内容如下

[root@server-lnmp ~]> vim /usr/local/php-fpm/etc/php-fpm.conf
[root@server-lnmp ~]> cat /usr/local/php-fpm/etc/php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include etc/php-fpm.d/*.conf

创建pool配置文件存放目录

[root@server-lnmp ~]> mkdir /usr/local/php-fpm/etc/php-fpm.d

在pool配置文件存放目录创建pool配置文件 www.conf 并写入以下内容

[www]                   #pool名称可以随意定义
listen = /tmp/www.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 = 3   
pm.min_spare_servers = 3  
pm.max_spare_servers = 35 
pm.max_requests = 500     
rlimit_files = 1024       

再将www.conf文件复制一份命名为test.conf

然后修改内容如下

[test]
listen = 10.1.1.28:9000 
listen.mode=666
user = php-fpm
group = php-fpm
pm = static
pm.max_children = 5
pm.start_servers = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

检查php-fpm配置语法错误。重载配置文件

[root@server-lnmp ~]> /usr/local/php-fpm/sbin/php-fpm -t
[08-Jul-2018 22:24:42] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@server-lnmp ~]> /etc/init.d/php-fpm reload
Reload service php-fpm  done

检查php-fpm进程

[root@server-lnmp ~]> ps -ef | grep php
root       1521      1  0 22:27 ?        00:00:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm    1522   1521  0 22:27 ?        00:00:00 php-fpm: pool test
php-fpm    1523   1521  0 22:27 ?        00:00:00 php-fpm: pool test
php-fpm    1524   1521  0 22:27 ?        00:00:00 php-fpm: pool test
php-fpm    1525   1521  0 22:27 ?        00:00:00 php-fpm: pool test
php-fpm    1526   1521  0 22:27 ?        00:00:00 php-fpm: pool test
php-fpm    1527   1521  0 22:27 ?        00:00:00 php-fpm: pool www
php-fpm    1528   1521  0 22:27 ?        00:00:00 php-fpm: pool www
php-fpm    1529   1521  0 22:27 ?        00:00:00 php-fpm: pool www
root       1531   1277  0 22:27 pts/0    00:00:00 grep --color=auto php



##最后一列可以看到pool的名称, test5个线程 www3个线程

php-fpm慢执行日志

当有时候访问php网页慢的时候

可以开启慢执行日志来查看是否是PHP代码执行时间过长,

还可以看到具体是哪个PHP文件的哪一行导致的慢执行

配置方式

vim /usr/local/php-fpm/etc/php-fpm.d/test.conf 加入如下内容

request_slowlog_timeout = 2       #当执行时间超过指定的时间(单位:秒),记录慢执行日志
slowlog = /usr/local/php-fpm/var/log/test-slow.log  #指定慢执行日志文件路径

配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为10.1.1.28:9000

[root@server-lnmp ~]> grep 'fastcgi_pass' /usr/local/nginx/conf/vhost/test.com.conf 
       fastcgi_pass 10.1.1.28:9000;

重新加载nginx配置

在/data/wwwroot/www.test.com/目录下创建一个测试文件pool.php

[root@server-lnmp ~]> vim /data/wwwroot/www.test.com/pool.php

[root@server-lnmp ~]> cat !$
cat /data/wwwroot/www.test.com/pool.php
<?php
echo 'test slow log';
sleep(3);
echo 'done';
?>


##php的sleep()函数可以让程序睡眠指定的秒数,用于模拟PHP执行慢的情况。

测试效果

使用curl测试访问www.test.com/pool.php

[root@server-lnmp ~]> curl -x127.0.0.1:80 www.test.com/pool.php
test slow logdone

查看慢执行日志

[root@server-lnmp ~]> cat /usr/local/php-fpm/var/log/test-slow.log 

[08-Jul-2018 23:05:13]  [pool test] pid 1571
script_filename = /data/wwwroot/www.test.com/pool.php
[0x00007f07966e3288] sleep() /data/wwwroot/www.test.com/pool.php:3


#错误日志可以看到,发生慢执行的时间 pool名,pid


#php文件路径,


#具体哪一行代码产生的慢执行

php-fpm的open_basedir

设定open_basedir可以使PHP只能访问指定目录下的文件

可以在虚拟主机配置中配置open_basedir

也可以在php的pool池中配置open_basedir

配置方式

修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件

添加open_basedir的配置

cd /usr/local/php-fpm/etc/php-fpm.d/
echo "php_admin_value[open_basedir]=/data/wwwroot/www.test1com:/tmp/" >> test.conf 


#php_admin_value[open_basedir]  这个参数就是定义open_basedir


##/data/wwwroot/www.test1com:/tmp/"  这个地址现在是错误的

修改/usr/local/php-fpm/etc/php.ini

将error_reporting的参数修改为E_ALL,修改error_log日志文件路径


#查看修改后的error_report参数

[root@server-lnmp etc]> grep '^error_reporting = ' php.ini
error_reporting = E_ALL


#查看error_log路径

[root@server-lnmp etc]> grep '^error_log = ' php.ini 
error_log = /usr/local/php-fpm/var/log/php_errors.log


#手动生成日志文件,并修改权限

[root@server-lnmp etc]> touch /usr/local/php-fpm/var/log/php_errors.log
[root@server-lnmp etc]> chmod 777 /usr/local/php-fpm/var/log/php_errors.log

重启php-fpm服务

[root@server-lnmp php-fpm.d]> /usr/local/php-fpm/sbin/php-fpm -t
[08-Jul-2018 23:48:02] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@server-lnmp php-fpm.d]> /etc/init.d/php-fpm reload
Reload service php-fpm  done

测试效果

curl测试访问www.test.com/test.php,出现错误 :

[root@server-lnmp php-fpm.d]> curl -x127.0.0.1:80 www.test.com/test.php
No input file specified.
[root@server-lnmp php-fpm.d]> curl -x127.0.0.1:80 www.test.com/test.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.1
Date: Sun, 08 Jul 2018 15:51:42 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

查看php错误日志

[root@server-lnmp etc]> cat /usr/local/php-fpm/var/log/php_errors.log
[08-Jul-2018 15:58:50 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/www.test.com/test.php) is not within the allowed path(s): (/data/wwwroot/www.test1com:/tmp/) in Unknown on line 0
[08-Jul-2018 15:58:50 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0

再修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件

将open_basedir修改为正确的路径

[root@server-lnmp etc]> vim php-fpm.d/test.conf 
[root@server-lnmp etc]> tail -1 php-fpm.d/test.conf 
php_admin_value[open_basedir]=/data/wwwroot/www.test.com:/tmp/

重载php-fpm服务配置在再次访问测试页www.test.com/test.php

[root@server-lnmp etc]> curl -x127.0.0.1:80 www.test.com/test.php -I
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Sun, 08 Jul 2018 16:04:11 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

[root@server-lnmp etc]> curl -x127.0.0.1:80 www.test.com/test.php
PHP test page

扩展

针对请求的uri来代理
根据访问的目录来区分后端的web
nginx长连接
nginx算法分析
nginx中的root和alias区别
nginx的alias和root配置
这个更详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值