部署的顺序先有后端web7,8,再有前端的lb-5。
web7
# 装nginx
groupadd www -g 666
useradd www -s /sbin/nologin -M -u 666 -g 666
# 你要确保,你装的所有机器,软件版本都一致,否则可能出奇怪bug
#web7 ,web8用同一套软件,你最好自己去自建yum源
cat > /etc/yum.repos.d/61.repo <<EOF
[local-rpm]
name=local yum repo
baseurl=http://172.16.1.61:12345
enabled=1
gpgcheck=0
EOF
yum clean all
yum install nginx -y
# 装php
# 卸载旧环境
yum remove php-mysql-5.4 php php-fpm php-common -y
yum install -y php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb php71w-json php71w-pecl-apcu php71w-pecl-apcu-devel
修改php的配置文件
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
看一看,该配置中,默认以fastcgi协议运行的参数
这里就明确告诉你,后端这个应用服务器,php-fpm
是以 fastcgi协议运行在127.0.0.1:9000地址上。
这里看懂扣1,不懂2
12 ; The address on which to accept FastCGI requests.
13 ; Valid syntaxes are:
14 ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
15 ; a specific port;
16 ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
17 ; a specific port;
18 ; 'port' - to listen on a TCP socket to all addresses
19 ; (IPv6 and IPv4-mapped) on a specific port;
20 ; '/path/to/unix/socket' - to listen on a unix socket.
21 ; Note: This value is mandatory.
22 listen = 127.0.0.1:9000
查看,启动后端的应用服务器(php-fpm)
systemctl start php-fpm
确保后端应用服务器,运行起来了
[root@web-7 /etc/yum.repos.d]#netstat -tunlp|grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 5011/php-fpm: maste
下一步,你可以做什么事了?
写php代码文件,看一看这个后端应用服务器,是否可以正常执行php源代码
这句话看懂扣1,不懂2
问题就在于,你如何把一个请求,发给这个fastcgi服务器(php-fpm)
比如你想访问一个机器上的 test-info.php代码文件
1.你先在机器上准备一个文件
/php-code/test-info.php
2.部署nginx服务器,去找这个资源
# 错误在于,你没有正确的,转发fastcgi可以认识的数据格式!!!
# 大坑在这里!!!!
# 因为你访问的请求是http://10.0.0.7/test-info.php
# 所有的信息都在http的请求头中
# 但是这堆数据,转发给了fastcgi_pass 127.0.0.1:9000;
# 但是数据走向是 client > http > nginx(fastcgi_params改写数据格式) > (fastcgi php-pm)
#
[root@web-7 /etc/nginx]## 看懂掌声
[root@web-7 /etc/nginx]#
[root@web-7 /etc/nginx]#
[root@web-7 /etc/nginx]#ls
conf.d default.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
[root@web-7 /etc/nginx]#
[root@web-7 /etc/nginx]#cat conf.d/php.conf
server {
listen 80;
server_name _;
location / {
root /php-code/;
# 请求转发给后端
fastcgi_pass 127.0.0.1:9000;
# 保留请求的url格式
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 将http数据,转换为fastcgi协议
include fastcgi_params;
}
}
3. 当你已http协议去访问这个源的时候
http://10.0.0.7:80/test-info.php
↓
到达nginx,找到test-info.php
↓
fastcg_pass 127.0.0.1:9000; (php-fpm去读取,执行test-info.php)
↓
返回执行结果给nginx
↓
用户浏览器看到这个代码的结果
过滤进程,和端口
[root@web-7 /php-code]#
[root@web-7 /php-code]#netstat -tunlp|grep -E '(nginx|php)'
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 5011/php-fpm: maste
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5095/nginx: master
[root@web-7 /php-code]#ps -ef|grep -E '(nginx|php)'
root 5011 1 0 09:48 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
www 5012 5011 0 09:48 ? 00:00:00 php-fpm: pool www
www 5013 5011 0 09:48 ? 00:00:00 php-fpm: pool www
www 5014 5011 0 09:48 ? 00:00:00 php-fpm: pool www
www 5015 5011 0 09:48 ? 00:00:00 php-fpm: pool www
www 5016 5011 0 09:48 ? 00:00:00 php-fpm: pool www
root 5095 1 0 09:55 ? 00:00:00 nginx: master process nginx
nginx 5096 5095 0 09:55 ? 00:00:00 nginx: worker process
root 5119 2054 0 09:57 pts/1 00:00:00 grep --color=auto -E (nginx|php)
注意授权
chown -R www.www /php-code/
确保最终访问php-info页面正常
nginx结合php的一个运行环境。
你要注意,以下知识点,是大坑。
1. 在部署wordpress的时候,你会设置nginx的访问入口,定义好域名,端口
这个域名,和端口,定义好后,就别动了,别随便修改,数据都写入到数据库里了
2. 基于web7部署好wordpress之后,数据就会写入到db-51
web8,就无须再初始化了,能自动读取db-51的数据,直接看到内容。。wordpress会自动提示你,已有数据,无须初始化
部署web8
同时,部署web7,web8,从零初始化安装wordpress
部署网站的理念,之前给大家说过,两种形式
web-7 wordpress db-51数据库 也有数据
新添加web8 ,将web7的配置,完全一致的,复制到web8上来,数据库都共用同一套db-51,即可看到数据一致的页面。。
(基于已有环境,去复制新环境,的部署方法)
1. 在已有成熟环境的情况下,做数据迁移,也就是web7 完全部署好了的情况
2. 从零开始初始化的情况,web7,web8,都是新机器,两个机器,从零部署。
(用在你基于ansible一键自动化部署,多台机器的,统一操作方式,让你理解ansible如何自动化部署多个网站产品的思路。你能会先手动部署这个环境)
部署web8的nginx+php环境
# 装nginx
groupadd www -g 666
useradd www -s /sbin/nologin -M -u 666 -g 666
# 讲道理,在你自建yum源之后,应该去除其他的第三方的yum源
# 只保留这一个61.repo文件。
cat > /etc/yum.repos.d/61.repo <<EOF
[local-rpm]
name=local yum repo
baseurl=http://172.16.1.61:12345
enabled=1
gpgcheck=0
EOF
yum clean all
yum install nginx -y
yum remove php-mysql-5.4 php php-fpm php-common -y
yum install -y php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb php71w-json php71w-pecl-apcu php71w-pecl-apcu-devel
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
systemctl start php-fpm
# 脚本的逻辑性,先后关系
# 在配置文件之前,先创建好测试数据,然后再去启动,否则报错
# 保证如下配置,原始的内容,发过去即可
# 创建如下完整的配置信息,即可
cat >/etc/nginx/conf.d/php.conf <<EOF
server {
listen 80;
server_name _;
location / {
root /php-code/;
# 请求转发给后端
fastcgi_pass 127.0.0.1:9000;
# 保留请求的url格式
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 将http数据,转换为fastcgi协议
include /etc/nginx/fastcgi_params;
}
}
EOF
# 创建好测试数据
mkdir -p /php-code/
chown -R www.www /php-code/
cat >/php-code/test-info.php <<EOF
web88888888888888
<?php
phpinfo();
?>
EOF
# 最后去启动nginx,然后确保可以访问
裁了虚拟主机加载顺序的大坑
部署db-51
web7 web8
都已经提供好了 nginx+php的环境
下一步就是准备wordpress代码即可,修改nginx配置即可
你现在用了2个机器,因此数据库别分开,导致2份数据。。
部署mariadb db-51机器,远程连接 目的是为了让2个产品的数据一致!!!!
清空旧的yum源
rm -f /etc/yum.repos.d/*.repo
cat > /etc/yum.repos.d/61.repo <<EOF
[local-rpm]
name=local yum repo
baseurl=http://172.16.1.61:12345
enabled=1
gpgcheck=0
EOF
yum install mariadb-server mariadb -y
systemctl start mariadb
启动,修改密码,授予远程访问
[root@db-51 ~]#systemctl start mariadb
[root@db-51 ~]#
[root@db-51 ~]#
[root@db-51 ~]#mysqladmin -uroot -p password 'laoliu666'
Enter password:
直接非交互式的创建一个用于远程连接的用户
[root@db-51 ~]#mysql -uroot -plaoliu666 -e "grant all privileges on *.* to lisa@'%' identified by 'lisa666'"
本地测试该用户是否可以用,指定机器的ip即可
mysql -ulaoliu -plaoliu666 -h10.0.0.51
得用root创建
还得去创建一个数据库wordpress(初始化创建是空的目录,初始化安装wordpress之后,就会写入大量的数据)
[root@db-51 ~]#mysql -uroot -plaoliu666 -e "create database wordpress"
部署web7和web8的wordpress从这开始
如下操作,web7 和web8都得有
创建目录
mkdir -p /mysite/wordpress
cd /mysite/wordpress
[root@web-7 /mysite/wordpress]#ls
wordpress-5.9.3-zh_CN.zip
解压缩源代码
明确,wordpress网站的代码,目录在 、/mysite/wordpress
[root@web-7 /mysite/wordpress]#
[root@web-7 /mysite/wordpress]#ls /mysite/wordpress/
index.php wp-admin wp-includes wp-signup.php
license.txt wp-blog-header.php wp-links-opml.php wp-trackback.php
readme.html wp-comments-post.php wp-load.php xmlrpc.php
wordpress wp-config-sample.php wp-login.php
wordpress-5.9.3-zh_CN.zip wp-content wp-mail.php
wp-activate.php wp-cron.php wp-settings.php
到这里,看懂扣 1 不懂 2
授权
chown -R www.www /mysite/
2.修改nginx的配置文件,创建wordpress的虚拟主机
cat /etc/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name wordpress.linux0224.cc;
#2. 除了.php结尾的请求,都发给nginx去处理,如css。js
location / {
root /mysite/wordpress/;
index index.php index.html;
}
#以.php后缀的请求,才给php-fpm去处理
location ~* \.php$ {
root /mysite/wordpress/;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
3. 可以启动nginx了
nginx
检查进程端口
客户端测试访问了()dns解析做好
10.0.0.7 wordpress.linux0224.cc
生成了数据库信息文件 wp-config.php
[root@web-7 /mysite/wordpress]#ls /mysite/wordpress/wp-config.php
/mysite/wordpress/wp-config.php
发给web8
[root@web-7 /mysite/wordpress]#scp /mysite/wordpress/wp-config.php root@172.16.1.8:/mysite/wordpress/
The authenticity of host '172.16.1.8 (172.16.1.8)' can't be established.
ECDSA key fingerprint is SHA256:Csqwr63+SZRFFOug/IGoFTgRe8hDSI/QalSMBcC6IaU.
ECDSA key fingerprint is MD5:4c:9a:37:e2:5b:b5:de:a8:bf:90:b5:28:d8:5b:ac:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.8' (ECDSA) to the list of known hosts.
root@172.16.1.8's password:
wp-config.php
修改dns为web8,确保可以正常访问
#10.0.0.7 wordpress.linux0224.cc
10.0.0.8 wordpress.linux0224.cc
部署lb-5负载均衡
2. 部署lb-5机器(使用nginx的七层负载均衡)
部署nginx,设置nginx
rm -f /etc/yum.repos.d/*.repo
cat > /etc/yum.repos.d/61.repo <<EOF
[local-rpm]
name=local yum repo
baseurl=http://172.16.1.61:12345
enabled=1
gpgcheck=0
EOF
yum clean all
yum install nginx -y
3.设置nginx负载均衡的规则
提供 80端口,以及域名
# lb-5机器,是基于http转发请求的,规则,和参数,不一样了!!
# 限定义 基于http协议的一组服务器,以及负载均衡的规则。
upstream my-web {
server 172.16.1.7:80 weight=4 ;
server 172.16.1.8:80 weight=1 ;
}
# nginx这里,基于http协议转发请求,且注意保留客户端的请求http信息
server {
listen 80;
server_name wordpress.linux0224.cc;
# 这里不需要判断url了,直接所有请求,全部甩给后端即可
# 后端的nginx在等待着用户的请求url格式,然后去解析
# 因此这里直接甩如下配置即可
location / {
proxy_pass http://my-web/;
include /etc/nginx/proxy_params;
}
}
# 4.创建代理参数文件
vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
# 5.启动nginx
[root@lb-5 /etc/nginx/conf.d]#nginx
[root@lb-5 /etc/nginx/conf.d]#ps -ef|grep nginx
root 1990 1 0 12:44 ? 00:00:00 nginx: master process nginx
nginx 1991 1990 0 12:44 ? 00:00:00 nginx: worker process
测试访问是否正常
做好dns解析
10.0.0.5 wordpress.linux0224.cc
[C:\~]$ ping wordpress.linux0224.cc
常见负载均衡故障
1. 入口的slb挂了(因此你必须学习,高可用性负载均衡)
[root@lb-5 /etc/nginx/conf.d]## 会发生什么?
[root@lb-5 /etc/nginx/conf.d]## 入口挂了。
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]##请求直接就拒绝了,和网站就无法通信了。
2. 后端节点挂了(后端的nginx代理挂了)
[root@lb-5 /etc/nginx/conf.d]## 分析一波,nginx请求会发给Upstream地址池的节点
[root@lb-5 /etc/nginx/conf.d]## 如果某个节点不通了,会被剔除
[root@lb-5 /etc/nginx/conf.d]## 模拟的是172.16.1.7:80
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]## 模拟的是172.16.1.7:80 80端口挂了,节点挂了,被剔除,请求全部走 另外的节点,完全懂了 ,扣 1,不懂2
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]## 不会有英雄
[root@lb-5 /etc/nginx/conf.d]## 不会有影响
[root@lb-5 /etc/nginx/conf.d]#
[root@lb-5 /etc/nginx/conf.d]## 如何判断是否有故障,看日志,是否记录,
# 不通
curl 172.16.1.7:80
curl: (7) Failed connect to 172.16.1.7:80; Connection refused
这个故障,,以及修复方式。(修复的是upstrem中定义的后端节点地址。。)
确保172.16.1.7:80 这个地址又通了。。
修复,确保通
修复好web7的nginx后,负载均衡又恢复了 4 1 比率。完全看懂扣 6不懂7
3. 后端的应用服务器挂了。。。(php-fpm挂了,怎么办,错误类型是什么)
模拟web8的后端故障
[root@web-8 ~]#pkill -9 php-fpm
4.最后总结,在线上维护网站架构,要搞清楚,什么节点,挂了,请求如何通信
这个web8机器的 php-fpm挂了。