和简单的代理不一样,负载均衡多了一个upstream,在这里定义后端的Web Server,能够是一个,也能够是多个。php
咱们用dig命令查看www.baidu.com域名对应的IP:html
能够看到两个IP,这两个IP均可以访问到www.baidu.com:nginx
能够看到两个IP返回的结果是同样的,有两个IP就能够走负载均衡了,配置过程以下:算法
#vim /usr/local/nginx/conf/vhost/load.confvim
写入以下内容:后端
upstream baidu_com { ip_hash; server 220.181.57.216:80; server 123.125.115.110:80; } server { listen 80; server_name www.baidu.com; location / { proxy_pass http://baidu_com; 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,能够是一个,也能够是多个。其中ip_hash为负载均衡的算法,它表示根据IP地址把请求分到不一样的服务器上。下面进行测试:浏览器
能够看到,咱们的虚拟机也能够访问www.baidu.com了,这就是代理的做用。另外,nginx不支持代理https。安全
HTTPS,是一种加密的HTTP协议,若是HTTP通讯的数据包在传输过程当中被截获,咱们能够破译这些数据包里面的信息,这里面不乏一些用户名、密码、手机号等敏感信息。而若是使用HTTPS通讯,即便数据包被截获,咱们也没法破译里面的内容。服务器
HTTPS的通讯过程大体以下:负载均衡
(1)、浏览器发送一个HTTPS请求给服务器。
(2)、服务器要有一套数字证书,能够本身制做,也能够向组织申请,区别在于本身颁发的证书须要客户端验证经过,才能够继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。
(3)、服务器会把公钥传输给客户端。
(4)、客户端收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机字符串,并用收到的公钥加密。
(5)、客户端把加密后的随机字符串传输给服务器。
(6)、服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机字符串后,再用这串随机字符串加密传输的数据。
(7)、服务器把加密后的数据传输给客户端。
(8)、客户端收到数据后,再用本身的私钥(就是那个随机字符串)解密。
过程以下:
生成两个文件:公钥zhangjin.crt和私钥zhangjin.key。
新建配置文件:#vim /usr/local/nginx/conf/vhost/ssl.conf,并写入如下内容:
server { listen 443; server_name zhangjin.com; index index.html index.php; root /data/nginx/zhangjin.com; ssl on; ssl_certificate zhangjin.crt; ssl_certificate_key zhangjin.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/nginx/aming.com$fastcgi_script_name; } access_log /tmp/1.log combined_realip; }
保存文件后,检查配置是否有问题:
启动失败,说明当前的Nginx并不支持ssl,这是由于以前编译时,并无额外配置支持ssl的参数,解决的方法是从新编译一遍Nginx:
[root@zhangjin-120:/usr/local/nginx/conf]#cd /usr/local/src/nginx-1.12.1/ [root@zhangjin-120:/usr/local/src/nginx-1.12.1]#./configure --prefix=/usr/local/nginx --with-http_ssl_module [root@zhangjin-120:/usr/local/src/nginx-1.12.1]#make & make install
编译完成后,再来检验一下:
没有问题,咱们再建立对应的目录和测试文件:
[root@zhangjin-120:~]#mkdir /data/nginx/zhangjin.com [root@zhangjin-120:~]#echo "<?php phpinfo(); ?>" > /data/nginx/zhangjin.com/test.php [root@zhangjin-120:~]#/etc/init.d/nginx restart Restarting nginx (via systemctl): [ 肯定 ]
而后编辑hosts文件,写入一行:
192.168.6.120 zhangjin.com
用浏览器访问https://zhangjin.com/test.php会提示不安全:
Nginx能够配置多个虚拟主机,php-fpm一样也支持配置多个pool,每个pool能够监听一个端口,也能够监听一个socket。
咱们把php-fpm.conf配置文件作一个更改:
#vim 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
保存后,再建立配置文件目录和子配置文件:
[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf [root@zhangjin-120:/usr/local/php-fpm/etc]# [root@zhangjin-120:/usr/local/php-fpm/etc]#mkdir /usr/local/php-fpm/etc/php-fpm.d [root@zhangjin-120:/usr/local/php-fpm/etc]#cd /usr/local/php-fpm/etc/php-fpm.d/ [root@zhangjin-120:/usr/local/php-fpm/etc/php-fpm.d]#vim www.conf [www] listen = /tmp/php-fcgi.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
保存后,再编辑另外的配置文件:
[root@zhangjin-120:/usr/local/php-fpm/etc]#vim php-fpm.conf [zhangjin] listen = /tmp/zhangjin.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监听了/tmp/www.sock,第二个pool监听了/tmp/zhangjin.sock。这样,就能够在Nginx不一样的虚拟主机中调用不一样的pool,从而达到相互隔离的目的,两个pool互不影响。下面来验证下配置是否有问题:
而后重启下php-fpm服务:
再来查看/tmp/目录下面的sock文件:
经过php-fpm的慢执行日志,咱们能够很是清晰地了解到PHP的脚本哪里执行时间长,它能够定位到具体的行。
开启和查看php-fpm的慢执行日志,操做步骤以下:
#vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
第一行定义超时时间,即PHP的脚本执行时间只要超过1秒就会记录日志,第二行定义慢执行日志的路径和名字。
open_basedir的目的就是安全。httpd能够针对每一个虚拟主机设置一个open_basedir,php-fpm一样也能够针对不一样的pool设置不一样的open_basedir:
[root@zhangjin-120:/usr/local/php-fpm]#vim /usr/local/php-fpm/etc/php-fpm.d/zhangjin.conf [zhangjin] listen = /tmp/zhangjin.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_admin_value[open_basedir]=/data/www/:/tmp/ #在最后面加这一行内容
只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可使用open_basedir来物理隔离多个站点了,从而达到安全的目的。
#cat /usr/local/php-fpm/etc/php-fpm.d/www.conf #查看配置文件内容 pm = dynamic #定义php-fpm的子进程启动模式,dynamic为动态模式;一开始只启动少许的子进程,根据实际需求,动态地增长或减小子进程,最多不会超过pm.max_children定义的数值。另一种模式为static,这种模式下的子进程数量由pm.max_children决定,一次性启动这么多,不会减小也不会增长。 pm.max_children = 50 pm.start_servers = 20 #针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。 pm.min_spare_servers = 5 #针对dynamic模式,它定义在空闲时段子进程数的最少数量,若是达到这个数值时,php-fpm服务会自动派生新的子进程。 pm.max_spare_servers = 35 #也是针对dynamic模式的,它定义在空闲时段子进程数的最大值,若是高于这个数值就开始清理空闲的子进程。 pm.max_requests = 500 #针对dynamic模式,它定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程中最多能够处理这么多请求,当达到这个数值时,它会自动退出。