第二十二课LNMP环境配置下

12.17 Nginx负载均衡

1、什么是负载均衡?

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 负载均衡是当下广泛流行的web架构中极其重要的一环,为服务器稳定性提供重要保障,同时也保障了用户体验,Nginx用作负载均衡时, Nginx用作负载均衡时,前端支持http和https,后端访问目前只支持http,暂未支持https,据说新版本将会支持代理tcp

vim /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

        ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    upstream myapp1 {
        ip_hash;
            server localhost:18080;
            server localhost:18081;
            server localhost:18082;
        }

        server {
                listen 8000;
        location / {
                proxy_pass http://myapp1;
        }
    }

}

其中,加入了下面这几行

upstream myapp1 {
        ip_hash;
            server localhost:18080;
            server localhost:18081;
            server localhost:18082;
}
server {
            listen 8000;
            location / {
                proxy_pass http://myapp1;
        }
}

工作原理是这样的:nginx监听本地的8000端口,并将请求转发到localhost:18080,localhost:18081和localhost:18082三个app中的一个,映射的策略是ip_hash,这个策略会对请求的ip进行hash运算并将结果映射到其中一个app,它能确保一个确定的请求ip会被映射到一个确定的服务,这样就连session的问题也不用考虑了。

配置完成后,你只需要在本地其三个服务,分别监听18080,18081和18082,然后打开浏览器访问localhost:8000,就会访问到你的其中一个服务。

12.18 ssl原理

https和http相比,https的通信是加密的。如果不加密,比如你访问一个很重要的网站,数据包还是会到达,但是可能会用人从中间复制一份。https会把数据包加密,就算从中间复制也无法解码。

https的工作流程:

1.浏览器发送一个https的请求给服务器。 2.服务器有一套数字证书,可以自己制作也可以向组织申请,区别积水自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出 (这套证书其实就是一对公钥和私钥) 3.服务器会把公钥传输给客户端 4.客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串,并用收到的公钥加密。 5.客户端把加密的随机字符串传输给服务器 6.服务器收到加密随机字符串后,先用私钥解密,获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,也就是将数据和这个随机字符串通过某种算法混合一起,这一除非知道私钥,否则无法获7.取数据内容) 8.服务器把加密后的数据传输给客户端。 9.客户端收到数据后,在用自己的私钥也就是那个随机字符串解密。

12.19 生成ssl密钥对

cd /usr/local/nginx/conf\\进入目录
openssl genrsa -des3 -out tmp.key 2048\\生成私钥,key文件为私钥
因为设置了密码太麻烦,所以要转换key,取消密码:
 openssl rsa -in tmp.key -out amo.key  
 rm -f tmp.key
 生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件:
 openssl req -new -key amo.key -out amo.csr
 生成公钥:
 openssl x509 -req -days 365 -in amo.csr -signkey amo.key -out amolinux.crt\\这里的amo.crt为公钥

12.20 Nginx配置ssl

生成一个新的配置文件,加入如下内容:

vim /usr/local/nginx/conf/vhost/ssl.conf
 server
{
    listen 443;
    server_name amo.com;
    index index.html index.php;
    root /data/wwwroot/amo.com;
    ssl on;
    ssl_certificate amolinux.crt;
    ssl_certificate_key amo.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
再检测并重新加载 :
-t && -s reload //若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module
重新检测OK后再来重启一下nginx:

/etc/init.d/nginx restart
创建目录: mkdir /data/wwwroot/amo.com

 echo “ssl test page.”>/data/wwwroot/aming.com/index.html
 vim /etc/hosts 编辑hosts,增加 : 127.0.0.1 amo.com
 再来测试一下正常了:

 curl https://amo.com/

12.21 php-fpm的pool

和LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在,既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include。 Nignx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。 php-fpm可以设置多个pool,在其中一个pool资源耗尽,会导致其他站点无法访问资源,报502错误。有必要把站点进行分离,分别使用单独的pool。我们可以在php-fpm.conf 中定义include,进而定义单独的pool。具体过程如下: vim /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
cd /usr/local/php-fpm/etc/
mkdir php-fpm.d
cd php-fpm.d/
vim www.conf //写入内容如下,添加第一个pool
[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
保存后 再编辑另外的配置文件,再创建一个pool
vim test.conf
[test]
listen = /tmp/test.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
这样有了两个子配置文件,也就是创建了两个pool了,两个pool监听了不同的socket,我们就可以在虚拟主机配置文件中给不同的虚拟主机定义不同的pool,从而达到互相隔离的目的。
测试下配置
/usr/local/php-fpm/sbin/php-fpm -t
重启下服务
/etc/init.d/php-fpm restart
查看下/tmp/下的sock文件:
ls /tmp/*.sock
再来查看下进程
ps aux |grep php-fpm
发现出现了www和test 两个pool

12.22 php-fpm慢执行日志

如果一个php网站可以访问,就是访问速度变慢了,我们如何进一步去查找原因呢?有没有办法追踪到导致php解析变慢的细节,这里就涉及到php-fpm的慢执行日志。通过php-fpm的慢执行日志,我们可以清晰的了解到php的脚本哪里执行时间长,它可以定位到具体的代码行。如何开启和查看该日志,具体操作如下: 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
第一行定义了超时时间,单位为秒,也就是当php脚本执行时间超过1秒就会记录日志
第二行定义该日志的路径和名称

我们编写一个php脚本测试

vim /data/wwwroot/test.com/slow.php
<?php
echo "just a slow running test";
sleep (3);
?>
curl -x127.0.0.1:80 test.com/slow.php
发现光标停顿了几秒才输出了just a slow running test
我们去查看下慢执行日志
cat /usr/local/php-fpm/var/log/www-slow.log

12.23 open_basedir

配置它的目的就是为了网站安全。httpd可以针对每个虚拟主机设置一个open_basedir,php-fpm同样也可以针对不同的pool设置不同的open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/test.conf  //在最后面加入
php_admin_value[open_basedir] = /data/wwwroot/test.com:/tmp/

只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点了,从而达到安全的目的。

12.24 php-fpm进程管理

先介绍下php-fpm.conf中一段配置的含义

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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。

扩展

针对请求的uri来代理 http://ask.apelearn.com/question/1049 根据访问的目录来区分后端的webhttp://ask.apelearn.com/question/920 nginx长连接 http://www.apelearn.com/bbs/thread-6545-1-1.html nginx算法分析http://blog.sina.com.cn/s/blog_72995dcc01016msi.html nginx中的root和alias区别http://blog.csdn.net/21aspnet/article/details/6583335 nginx的alias和root配置 http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ http://www.iigrowing.cn/shi-yan-que-ren-nginx-root-alias-location-zhi-ling-shi-yong-fang-fa.html 这个更详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值