
shell为LAMP的网站增加项目
一台运行LAMP环境的服务器,上面有几十个网站,每一个网站都分配了单独的虚拟主机和MySQL库。目前网站的数量还在持续增加,每增加一个网站需要做的操作如下:
- 1)新增一个Apache虚拟主机
- 2)新增一个ftp账号对该网站目录有管理权限
- 3)新增一个库
- 4)新增一个数据库用户管理新增库
由于这些操作具有非常高的重复度,所以适合用shell脚本实现。
知识点一:LAMP
LAMP是一个很常见的网站架构,它是Linux、Apache、MySQL和PHP的组合。其架构如下图所示:
Apache(也就是Httpd)是一款非常流行WEB服务器软件,它默认并不支持解析PHP脚本,在上面的架构中PHP作为Apache的一个模块(libphp5.so)实现了解析PHP脚本,而和MySQL数据库交互的行为是由这个libphp5.so来完成的。而PHP和MySQL的关联是由PHP里面的mysql.so模块实现。LAMP的搭建过程,不在本案例中描述,这里提供一篇搭建文档供你参考 https://www.cnblogs.com/minn/p/9232579.html (文档中关于mariadb和php7的安装可以忽略)
搭建好LAMP的环境后,需要配置虚拟主机,也就是说要想在LAMP环境中运行网站,首先要配置运行这个网站的一些指标,比如域名、网站路径等信息。如下为一个虚拟主机的参考配置,内容如下:
<VirtualHost *:80>
DocumentRoot /data/wwwroot/www.example.com
ServerName www.example.com
ServerAlias example.com
<Directory /data/wwwroot/www.example.com>
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
其中DocumentRoot为网站的根目录,ServerName为网站域名,ServerAlias为网站的第二个域名,下面的<Directory></Directory>部分用来配置访问权限。所以,增加网站就是增加这样的一段配置。
知识点二:FTP服务
FTP服务对于大家并不陌生,它主要用来传输文件。在LAMP的服务器上跑着很多网站,每一个网站的代码都应该分开来管理,这就需要针对每一个网站创建一个独立的FTP用户来管理本网站的文件。使用FTP上传、下载文件虽然很方便,但在安全性上会存在一定的风险,如果FTP的用户名、密码泄露后果不堪设想。另外一个层面,由于网站的文件权限比较复杂,不容易控制,权限给小了会导致网站访问出错,而权限给大了,又存在安全问题。
对于规模不大的网站,站长或者开发人员往往欠缺安全意识,为了便捷性所以直接使用FTP来管理网站,其实这并不可取,而应该使用专业的代码管理平台(如git)和代码上线部署的工具(如jenkins)。话虽如此,但本案例的场景就是使用FTP管理网站,在这里只是提醒一下各位读者朋友,这并不安全。
关于FTP的搭建,大家可以参考这篇文档https://www.cnblogs.com/xibei666/p/5934659.html
在本案例中的FTP用户也是虚拟用户,虚拟用户的好处是不用提供系统用户的密码,相对安全性更高。本案例shell脚本中的操作步骤就是参考上面的文档来实现的。
知识点三:在MySQL中增加用户
MySQL本身有命令行工具,在shell脚本中,我们通常是使用-e选项来实现的,以下命令为在MySQL中增加库:
# mysql -uroot -pyour_passwd -e "create database newdb"
MySQL默认有一个root用户,跟Linux的系统用户root一样,是超级管理员用户,它可以创建库、表以及普通用户等操作,创建普通用户并授权的命令如下:
# mysql -uroot -pyour_passwd -e "grant all on 'newdb.*' to 'user1'@'10.20.100.%' identified by 'user1_passwd'"
说明:这个all指的是所有权限,包括读、写、删除等全部操作权限。
on后面为库和表,用'.'把库和表分割开来,其中*表示所有表,即该库下的所有表。to后面为用户以及来源的IP地址,@后面为来源IP,可以用%表示通配,比如上例中10.20.100.%表示10.20.100.1-10.20.100.254全部的IP,当然IP这里也可以直接写%,这样则不限制来源IP。by后面那个字符为用户密码。有时候,我们创建完用户不会立即生效,是因为新增的用户还在缓存里,需要执行一个刷新权限的命令:
# mysql -uroot -pyour_passwd -e "flush privileges"
本案例参考脚本
#!/bin/bash
#本脚本的功能是在LAMP环境中增加站点,包括apache配置、FTP增加用户、MySQL增加库和用户
#网站目录
webdir=/data/wwwroot
#ftp的虚拟用户配置文件目录
ftpudir=/etc/vsftpd/vuuser
#ftp虚拟用户密码文件
ftpuserfile=/root/login
#mysql命令行登录root
mysqlc="/usr/local/mysql/bin/mysql -uroot -pjk1hYUcnt6"
#apache虚拟主机配置文件
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"
#定义增加MySQL库和用户的函数
add_mysql_user()
{
#生成随机密码
mysql_p=`mkpasswd -s 0 -l 12`
#将密码保存到临时文件里,这里的$pro为用户自定义的项目名字
echo "$pro $mysql_p" >/tmp/$pro.txt
#这里使用嵌入文档的形式(需顶格),将创建用户并授权的命令传递给mysql
$mysqlc <<EOF
create database $pro;
grant all on $pro.* to "$pro"@'127.0.0.1' identified by "$mysql_p";
#下面这个EOF必须要顶格
EOF
}
#定义增加FTP用户的函数
add_ftp_user()
{
ftp_p=`mkpasswd -s 0 -l 12`
echo "$pro" >> $ftpuserfile
echo "$ftp_p" >> $ftpuserfile
#将用户、密码文件转换为密码db文件
db_load -T -t hash -f $ftpuserfile /etc/vsftpd/vsftpd_login.db
cd $ftpudir
#这里的aaa是一个文件,是之前的一个项目,可以作为配置模板
cp aaa $pro
#把里面的aaa改为新的项目名字
sed -i "s/aaa/$pro/" $pro
#重启vsftpd服务
/etc/init.d/vsftpd restart
}
#定义增加apache虚拟主机的函数
config_httpd()
{
#增加网站根目录,和域名保持一致,这里的$dom为用户自定义的域名
mkdir $webdir/$dom
#将网站根目录属主和属组设置为ftp用户
chown vsftpd:vsftpd $webdir/$dom
#用嵌入文档(需顶格),把虚拟主机配置写入到配置文件里
cat >> $httpd_config_f <<EOF
<VirtualHost *:80>
DocumentRoot $webdir/$dom
ServerName $dom
<Directory $webdir/$dom>
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
EOF
#重载apache服务
/usr/local/apache2/bin/apachectl graceful
}
read -p "input the project name: " pro
read -p "input the domain: " dom
add_mysql_user
add_ftp_user
config_httpd
脚本执行后,会提示用户要输入项目名称和域名,如下:
# sh add_project.sh
input the project name: test123
input the domain: www.test123.com
这样,pro的值就是test123,而dom的值是www.test123.com。