简单web架构实例应用

一、架构图

  • dns完成解析web1,web2来实现负载均衡
  • web1,web2使用后台的mysql数据库
  • web1,web2的页面数据全部放在nfs数据上,实现自动挂载
  • nfs服务器为web1,web2提供网页数据
10.7.2. 准备工作

设置ip信息

nmcli con add ifname ens33 con-name ens33 type ethernet ipv4.method manual ipv4.address 192.158.46.150/24 ipv4.gateway 192.168.46.1

Note

我使用的nmcli修改的ip,当然也是可以手工修改的。
10.7.3. ansible的配置
10.7.3.1. 安装ansible

[[email protected] ~]# yum install ansible

10.7.3.2. 添加主机

需要添加如下内容到/etc/ansible/hosts文件中去。

[client]
192.168.46.159

[dns]
192.168.46.158

[web]
192.168.46.157
192.168.46.156
[db]
192.168.46.155
[nfs]
192.168.46.154
[self]
192.168.46.150

10.7.3.3. 配置免密码登陆

这里我之前写有一个脚本自动完成免密码登陆的脚本,参考我的博客

[[email protected] ~]# cat hosts.txt
192.168.46.150 root oracle
192.168.46.151 root oracle
192.168.46.152 root oracle
192.168.46.153 root oracle
192.168.46.154 root oracle
192.168.46.155 root oracle
192.168.46.156 root oracle
192.168.46.157 root oracle
192.168.46.158 root oracle
192.168.46.159 root oracle
192.168.46.160 root oracle
[[email protected] ~]# cat mima.sh
#!/bin/bash
#================================================
#FileName   :expect_ssh.sh
#Author     :zhaojiedi
#Description:
#DateTime   :2018-01-05 08:26:06
#Version    :V1.0
#Other      :
#================================================
host_username_password_file=hosts.txt

# install expect
rpm -q expect &>/dev/null || yum install -yq expect &>/dev/null

# create id_rsa.pub file
pubkey=~/.ssh/id_rsa.pub
if [ ! -e "$pubkey" ] ; then
        ssh-keygen  -P "" -t rsa  -f ~/.ssh/id_rsa
fi
while read host username password ; do
        con=${username}"@"${host}
        echo $password
        expect <<EOF
        set timeout 20
        spawn ssh-copy-id $con
        expect {
                "yes/no"  { send "yes\n" ; exp_continue }
                "password:" { send "${password}\n"; exp_continue }
        }
EOF
done < $host_username_password_file

# 执行下脚本,自动完成公钥copy工作了
[[email protected] ~]# bash mima.sh

# 测试下
[[email protected] ~]# ssh 192.168.46.151 ‘ip a show ens33‘

10.7.3.4. 设置主机名(可选)

我这里的机器全是刚刚克隆出来的虚拟机,为了管理方便设置下主机名,防止误操作。

# 创建一个设置主机名的脚本
[[email protected] ~]# vim set_hostname.sh
[[email protected] ~]# cat set_hostname.sh
#!/bin/bash
echo "start"
hostname
name=centos-$(ip a show ens33 |grep ‘inet.*ens33‘ | sed -r  -n ‘[email protected]*\.([0-9]{1,3})/.*@\[email protected]‘).linuxpanda.tech
echo $name
hostnamectl set-hostname $name
echo "end"

[[email protected] ~]# ansible all -m script -a ‘/root/set_hostname.sh‘

这个脚本也是设置了ansible主机的ip。
10.7.3.5. 防火墙和selinux关闭

# 关闭防火墙
[[email protected] ~]# ansible all -m service -a ‘name=firewalld enabled=no‘
[[email protected] ~]# ansible all -m service -a ‘name=firewalld state=stopped‘

[[email protected] ~]# ansible all -m shell -a ‘sed  -i -r ‘[email protected]=.*@[email protected]‘ /etc/sysconfig/selinux‘
[[email protected] ~]# ansible all -m shell -a  ‘setenforce 0‘

Note

如果原有selinux就是disabled,使用setenforce 0会报错误的,不用管它。
10.7.4. dns主机设置
10.7.4.1. dns配置

[[email protected] ~]# yum install bind bind-utils
[[email protected] ~]# vim /etc/named.conf
# 注释如下5行
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };
//      allow-query     { localhost; };
//      dnssec-enable yes;
//      dnssec-validation yes;
[[email protected] ~]# vim /etc/named.rfc1912.zones
# 添加如下内容,注意之后的分号
zone "linuxpanda.tech" IN {
        type master;
        file "linuxpanda.tech.zone";
};
[[email protected] ~]# cd /var/named/
[[email protected] named]# cp -a named.localhost  linuxpanda.tech.zone
[[email protected] named]# vim linuxpanda.tech.zone
[[email protected] named]# cat linuxpanda.tech.zone
$TTL 1D
@   IN SOA  ns1 admin (
                    0       ; serial
                    1D      ; refresh
                    1H      ; retry
                    1W      ; expire
                    3H )    ; minimum
    NS      ns1
ns1     A       192.168.46.158
web     A       192.168.46.157
web     A       192.168.46.156
www     CNAME   web

10.7.4.2. dns本机测试

[[email protected] named]# dig www.linuxpanda.tech @localhost

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> www.linuxpanda.tech @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57957
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.linuxpanda.tech.               IN      A

;; ANSWER SECTION:
www.linuxpanda.tech.        86400   IN      CNAME   web.linuxpanda.tech.
web.linuxpanda.tech.        86400   IN      A       192.168.46.156
web.linuxpanda.tech.        86400   IN      A       192.168.46.157

;; AUTHORITY SECTION:
linuxpanda.tech.    86400   IN      NS      ns1.linuxpanda.tech.

;; ADDITIONAL SECTION:
ns1.linuxpanda.tech.        86400   IN      A       192.168.46.158

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 18 21:05:05 CST 2018
;; MSG SIZE  rcvd: 132

10.7.5. client主机测试

# 修改客户端的dns指向为我们自己的dns主机
[[email protected] ~]# nmcli con modify  ens33 ipv4.dns 192.168.46.158
# 重启网络,或者重新加载
[[email protected] ~]# service network restart

# ping下我们的web主机,看是否能解析出来157,156两个ip
[[email protected] ~]# ping www.linuxpanda.tech
PING web.linuxpanda.tech (192.168.46.157) 56(84) bytes of data.
64 bytes from 192.168.46.157 (192.168.46.157): icmp_seq=1 ttl=64 time=0.330 ms
64 bytes from 192.168.46.157 (192.168.46.157): icmp_seq=2 ttl=64 time=0.255 ms
64 bytes from 192.168.46.157 (192.168.46.157): icmp_seq=3 ttl=64 time=0.292 ms

[[email protected] ~]# ping www.linuxpanda.tech
PING web.linuxpanda.tech (192.168.46.156) 56(84) bytes of data.
64 bytes from 192.168.46.156 (192.168.46.156): icmp_seq=1 ttl=64 time=0.421 ms

Note

ping命令去测试有点不专业的,需要多次测试才能2个地址都出现,这里就不安装dig工具了,毕竟客户端。
10.7.6. nfs主机配置
10.7.6.1. 添加用户

[[email protected] ~]# groupadd -g 48 apache
[[email protected] ~]# useradd -u 48 -g 48 apache
[[email protected] ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)

10.7.6.2. 修改权限

[[email protected] ~]# chown -R apache.apache /data/html

10.7.6.3. 共享出去

[[email protected] ~]# yum install nfs-utils
[[email protected] ~]# vim /etc/exports
[[email protected] ~]# cat /etc/exports
/data/html 192.168.46.156(rw,all_squash,anonuid=apache,anongid=apache)
/data/html 192.168.46.156(rw,all_squash,anonuid=apache,anongid=apache)
[[email protected] ~]# systemctl restart nfsd
[[email protected] ~]# exportfs -v
/data/html          192.168.46.156(rw,sync,wdelay,hide,no_subtree_check,anonuid=48,anongid=48,sec=sys,secure,root_squash,all_squash)
/data/html          192.168.46.157(rw,sync,wdelay,hide,no_subtree_check,anonuid=48,anongid=48,sec=sys,secure,root_squash,all_squash)

10.7.7. mysql主机配置
10.7.7.1. 安装软件

[[email protected] ~]# yum install mariadb-server mariadb

10.7.7.2. 启动服务

[[email protected] ~]# systemctl start mariadb
[[email protected] ~]# netstat -tunlp |grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      13680/mysqld

10.7.7.3. 添加应用用户

[[email protected] ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> create database web ;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on web.* to [email protected]‘192.168.46.%‘ identified by ‘oracle‘;
Query OK, 0 rows affected (0.05 sec)

10.7.7.4. 安全初始化

[[email protected] ~]# mysql_secure_installation

10.7.8. web主机配置

这里是2个主机。
10.7.8.1. 安装软件

# 安装
[[email protected] ~]# ansible web -m yum -a ‘name=httpd,php-fpm,php-mysql,mod_fcgid state=installed‘
# 启动服务
[[email protected] ~]# ansible web -m service -a ‘name=httpd state=started‘
[[email protected] ~]# ansible web -m service -a ‘name=php-fpm state=started‘

10.7.8.2. 挂载目录

# 安装必要的挂载相关的软件
[[email protected] httpd]# yum install nfs-utils cifs-utils
# 启动rpc服务
[[email protected] httpd]# systemctl restart rpcbind
# 查看远程的导出情况
[[email protected] httpd]# showmount -e 192.168.46.154
Export list for 192.168.46.154:
/data/html 192.168.46.157,192.168.46.156
# 挂载
[[email protected] httpd]# mount 192.168.46.154:/data/html /var/www/html

# 自动挂载
[[email protected] httpd]# tail -n 1 /etc/mtab
192.168.46.154:/data/html /var/www/html nfs4 rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.46.156,local_lock=none,addr=192.168.46.154 0 0
[[email protected] httpd]# tail -n 1 /etc/mtab >> /etc/fstab
# 查看下样例网页
[[email protected] httpd]# cat /var/www/html/index.html
hellow world

10.7.8.3. 配置httpd

本部分内容需要在2个机器都要做一遍。

# 下载一个样例的php页面
[[email protected] httpd]# wget download.linuxpanda.tech/lamp/index.php.sample -O /var/www/html/index.php
# 编辑下样例php页面的数据库连接用户和密码
[[email protected] httpd]# vim /var/www/html/index.php
[[email protected] httpd]# cat /var/www/html/index.php
<?php
$mysqli=new mysqli("192.168.46.155","web","oracle");
if(mysqli_connect_errno()){
echo "失败了";
$mysqli=null;
exit;
}
echo "成功了";
$mysqli->close();
?>

# fcgi编辑
[[email protected] conf.d]# vim fcgid.conf
# 添加如下3行
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
# 重启网络服务
[[email protected] conf.d]# service httpd restart

10.7.8.4. 本机测试

本部分内容需要在2个机器都要做一遍。

[[email protected] conf.d]# curl localhost/index.php
成功了

10.7.9. client测试

[[email protected] ~]# curl http://www.linuxpanda.tech/index.php
成功了
# 把156的web停掉
[[email protected] ~]# curl http://www.linuxpanda.tech/index.php
成功了
# 再把157的web停掉
[[email protected] ~]# curl http://www.linuxpanda.tech/index.php
curl: (7) Failed connect to www.linuxpanda.tech:80; Connection refused

10.7.10. 总结

这个作业,看起来挺简单的,做起来还是遇到些麻烦的。

需要改进的地方:

    dns解析太不稳定,如果web1停掉,dns还可能解析到这个停掉的主机,就会导致web没法访问。
    mysql实例后面学习了主从可以考虑完善下。
    lamp没有使用xcache加速下
    本练习都是使用的yum安装的lamp环境,可以考虑使用编译安装方法。
    数据通过nfs共享,本质还是一个磁盘的数据,可以考虑使用rsync来替代nfs。
    数据文件可以考虑放到raid上,来提供文件的访问性能

原文地址:https://www.cnblogs.com/tanxiaojun/p/12151739.html

时间: 2025-01-13 19:20:25

简单web架构实例应用的相关文章

C# 最简单的三层架构实例 ——转载自网易博客

代码        /// <summary>        /// 初始化登录名称.登录密码(Model类)        /// </summary>        private string adminUser = string.Empty; //设置用户名称为空值        private string adminPwd = string.Empty; //设置用户密码为空值        public string AdminUser        {       

可扩展Web架构与分布式系统

开放源代码已经成为一些大型网站的基本原则.而在这些网站成长的过程中,一些优秀的实践经验和规则也出现在他们的结构中.本文旨在介绍一些在大型网站结构设计的过程中需要注意的关键问题以及实现目标的基础工作. 本文侧重于介绍网络系统,尽管一些准则在其他分布式系统中也是适用的. 1.1. web分布式系统的设计原则 搭建和运营一个可伸缩的web站点或者应用程序意味着什么?在原始层面上这仅仅是用户通过互联网连接到远程资源-使系统变得可伸缩的部分是将资源.或者访问的资源,分布于多个服务器上. 像生活中大多数事情

可伸缩Web架构与分布式系统(1)

开源软件近年来已变为构建一些大型网站的基础组件.并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露.这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件.本文主要关注于Web系统,然而其中的一些内容同样适用于其他分布式系统. 1.Web分布式系统设计准则 构建和运行一个可伸缩的网站或应用来说究竟意味着什么?从一个基本的层面来看,就是将用户和远程资源通过互联网连接起来——将其变得可伸缩的部分,是指这些资源或者访问这些资源是分布式的.贯穿于多个服务器.

可扩展Web架构与分布式系统(转)

1.1. web分布式系统的设计原则 搭建和运营一个可伸缩的web站点或者应用程序意味着什么?在原始层面上这仅仅是用户通过互联网连接到远程资源-使系统变得可伸缩的部分是将资源.或者访问的资源,分布于多个服务器上. 像生活中大多数事情一样,当构建一个web服务时花时间提前做好计划从长远看来还是很有帮助的:了解一些注意事项和大网站背后的权衡原则可以在创建小型网站时做出更明智的决定.以下是一些影响大规模web系统设计的关键原则: 可用性:对于很多公司来说一个网站的正常运行时间是非常关键的声誉和功能,像

web架构设计经验分享(转)

本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化一的架构,希望设计出具有无比扩展性,能适应一切需求的增加架构,web开发领

Python---BeautifulSoup 简单的爬虫实例

对python自动化比较熟的同学,很多都懂一些爬虫方法,有些还研究的很深,下面呢我介 绍一个简单的爬虫实例,供大家参考.当然里面有很多需求是可以再学习的,下载进度的显 示.下载完成的提示等等. 一.首先我们要研究爬虫网站的架构,我这里已ring.itools.cn为例,我需要爬的是铃声. 大家可以自己去分析,这个网站的架构比较简单就不讲了. 我们最终要获取的是下面两个信息: 二.我们写下面的脚本来获取 上面的脚本呢,获取到songname和playaddr都是一组数据,即都是列表,我们需要把 他

springMVC + oracle存储过程 构建高性能灵活易维护的java web架构

MVC让简单的业务也变得复杂 不知道你在使用MVC模式开发项目的时候是否觉得很麻烦,一个简单的增删改查动作却要涉及到多个文件操作. 以一条数据增加为例说明. 假设我们使用hibernate并且dao层是已经封装好的 从图中可以看出如果我们在系统中写一个增加功能需要自己动手写的地方至少是 jsp , action , service,servicesImpl 四层. 如果是复杂的添加操作那么我们很可能还会自己定义dao层的接口和方法,那样就是6层操作了. 如果使用mybatis 至少也是写4层,常

Tomcat是怎么工作的(2) -- 动手实现山寨版的简单Web Server

本文先讲解一下Java web server都是怎么工作的.web server也叫HTTP server——顾名思义它是用HTTP协议和客户端交互的.客户端一般就是各种各样的浏览器了.相信所有朋友都清楚这个基本事实,否则你也不会看到这个系列文章了. 基于Java的web server必然用到两个极其重要的类:java.net.Socket和java.net.ServerSocket,然后以HTTP消息进行交互. 1. HTTP协议简介(The Hypertext Transfer Protoc

使用HAproxy,keepalived实现简单LAMP架构的负载均衡与高可用

整个架构简单拓扑图如下所示: 其中: 192.168.10.66与192.168.10.6两台主机提供httpd服务 192.168.10.27与192.168.10.87两台主机提供varnish缓存服务 192.168.10.17与192.168.10.77两台主机安装HAProxy实现客户端请求的调控 192.168.10.7主机安装mariadb,提供数据存储服务 服务器与客户端连接ip地址为172.16.10.99/16, 一.httpd服务 1.分别于192.168.10.6与192