设置灯泡应用程序
#php #linux #mysql #apache

灯泡堆是开源技术的强大组合,使开发人员能够构建动态和交互式网站和Web应用程序。

本文是集装灯(Linux,Apache,MySQL,PHP)堆栈应用程序的综合指南。它涵盖了从设置应用程序到使用Docker命令和Docker组成以及监视容器的所有内容的所有内容。为了提高可读性,它已被分为不同的部分以形成系列。第一部分着重于在本地计算机上设置应用程序。

应用架构

image edit

请检查以下嵌入以查看高分辨率的图像:

在上面的体系结构图中,用户通过使用“ LocalHost”或服务器的IP地址访问应用程序来启动HTTP请求。该服务器安装了Apache,通过将“ Form.html”文件提供给用户响应,并提示他们填写其详细信息,包括他们的姓名,电子邮件和说明。

填写表单后,用户会将数据提交给服务器。然后,Apache将提交的数据转发到负责将此信息存储在MySQL数据库中的PHP脚本。如果数据成功存储,MySQL将将这一成功传达给PHP脚本,PHP脚本以用户浏览器中显示的HTML消息响应。另一方面,如果保存数据时存在问题,则PHP脚本将错误消息返回给用户的浏览器,并将遇到的问题通知他们。

这种强大的体系结构可确保用户,Apache,PHP和MySQL之间的无缝数据流,提供平稳的用户体验和可靠的数据管理。

先决条件

在开始之前,请确保您拥有以下内容:

应用程序设置

出于设置和测试目的,将在Linux Ubuntu OS上部署和测试该应用程序,并在MacOS环境中使用VirtualBox和Vagrant。

项目结构

在构建开始时,环境将类似于下面的结构,但是随着我们创建更多的文件夹和文件,结构将会更改。

.
├── form_submit.php
├── form.html
├── install.sh
├── setup.sh
└── vagrantfile

设置Linux环境

要在Mac上设置Linux环境,我们将使用Vagrant和Virtual Box。已经提供了一个脚本来自动提供它们。

nb:此步骤仅适用于Mac用户。 Linux用户可以进入installation部分。

  • 在项目根部创建一个install.sh文件,然后将以下内容复制到其中。
#/bin/sh

# Check if VirtualBox is installed
if ! command -v VBoxManage &> /dev/null; then
    echo "VirtualBox not found. Installing VirtualBox..."
    brew install --cask virtualbox
else
    echo "VirtualBox is already installed."
fi


# Check if Vagrant is installed
if ! command -v vagrant &> /dev/null; then
    echo "Vagrant not found. Installing Vagrant..."
    brew install --cask vagrant
    brew install --cask vagrant-manager
else
    echo "Vagrant is already installed."
fi
  • 给予脚本可执行的权限,并使用以下命令运行:
chmod +x install.sh
./install.sh

它将自动检查系统上是否已经在系统上安装了Vagrant和Virtual Box,如果它们安装了输出,则可以通知您。但是,如果找不到它们,该脚本将为您无缝安装Vagrant和VirtualBox。

也在项目文件夹的根部,创建一个vagrantfile文件并将以下内容粘贴到其中:

NUM_CONTROLLER_NODE = 1
IP_NTW = "192.168.56."
CONTROLLER_IP_START = 2
NODE_IP_START = 3

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/bionic64"

    i = 0

    (1..NUM_CONTROLLER_NODE).each do [i] 
        config.vm.define "dockertask" do |node|
            node.vm.provider "virtualbox" do |vb|
                vb.name = "dockertask"
                vb.memory = 2048
                vb.cpus = 2
            end

            node.vm.hostname = "dockertask"
            node.vm.network "private_network", ip: IP_NTW + "#{CONTROLLER_IP_START + i}"
            node.vm.network "forwarded_port", guest: 22, host: "#{2710 + i}"
        end
    end
end

此VagrantFile配置有助于自动设置Linux VM,并利用ubuntu/bionic64映像为设置。 VM已获得一个名称dockertask,您可以自由修改。要提供VM,请运行以下命令

vagrant up --provision

打开虚拟框应用程序以查看设置VM

nb:要无缝将文件从您的本地(MACOS)复制到Linux VM,您可以使用以下命令:

vagrant scp </absolute-path-of-the-project-directory-to-the project-folder/> <name-of-vm>:/home/vagrant
  • 应该看起来像这样:
vagrant scp /Users/favour/Desktop/Modules/module-2/ dockertask:/home/vagrant

请注意,每次在您的本地上进行更改时,应始终运行命令,以使Linux VM具有更新的版本。

安装

现在已配置VM,下一步涉及安装Apache,MySQL和PHP,为应用程序创建基本的LAMP堆栈基础。还提供了一个脚本来自动化安装过程。

  • 在项目文件夹的根部创建一个setup.sh文件,将以下内容复制并粘贴到其中:
#/bin/sh

# update the VM
sudo apt-get update -y

# Install apache web server and start it
sudo apt-get install apache2 -y
sudo service apache2 start

# Install mysql and go through the setup. Please remember your root password
sudo apt-get install mysql-server -y
sudo /usr/bin/mysql_secure_installation

# Install PHP
sudo apt-get install php -y
sudo apt-get install php-mysql -y
sudo apt-get install libapache2-mod-php -y
sudo apache2ctl -M
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo a2enmod php7.2
sudo /etc/init.d/apache2 restart

每个命令的作用:

  • sudo apt-get update -y这会更新软件包列表,并确保在进行任何安装之前,包装信息是最新的。

  • sudo apt-get install apache2 -y这在系统上安装了Apache Web服务器。 -y标志允许安装自动进行,而无需要求用户确认。

  • sudo service apache2 start此命令启动Apache Web服务器,因此它变得有效并可以服务网页。

  • sudo apt-get install mysql-server -y这安装了MySQL数据库服务器。 -y标志允许安装自动进行,而无需要求用户确认。

  • sudo /usr/bin/mysql_secure_installation此脚本通过一系列步骤来牢固地设置MySQL。它提示您配置root密码,删除匿名用户,禁用远程根登录等。

  • sudo apt-get install php -y在系统上安装了服务器端脚本语言的PHP。

  • sudo apt-get install php-mysql -y这安装了PHP MySQL扩展名,该扩展名允许PHP与MySQL数据库进行通信。如果您的PHP应用程序需要与MySQL数据库进行交互,则需要此扩展。

  • sudo apt-get install libapache2-mod-php -y这为Apache Web服务器(Libapache2-Mod-PHP)安装PHP模块以及其依赖项。 -y标志允许安装自动进行,而无需要求用户确认。

  • sudo apache2ctl -M此命令列出了所有已加载的Apache模块。它用于检查安装后PHP模块(MOD_PHP)是否成功加载。

  • sudo a2dismod mpm_event此禁用Apache事件模块(MPM_EVENT)切换到Prefork模块,这是使用Apache运行PHP所需的。

  • sudo a2enmod mpm_prefork这启用了Apache Prefork模块(MPM_PREFORK),这对于使用Php。

  • 是必不可少的
  • sudo a2enmod php7.2这启用了PHP版本7.2的Apache中的PHP模块(MOD_PHP)。如果您使用其他PHP版本,则将7.2替换为适当的版本。

  • sudo /etc/init.d/apache2 restart这将重新启动Apache Web服务器,以应用启用PHP模块并切换到Prefork模块所做的更改。

要执行脚本,运行以下命令:

chmod +x setup.sh
./setup.sh

会提示您要为MySQL选择密码级别,应该看起来像这样:

Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: y

最好是出于安全目的提供密码,因此输入“ y”,然后您将获得以下提示,要求您选择密码级别:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

对于确保MySQL Server,您可以选择选择首选项的密码复杂度级别。如果选择设置为“ 0”的“低”长度,则可以使用dockertask之类的密码来满足要求。

重要的是要注意,强烈建议选择一个更复杂的密码,尤其是对于生产环境,以提高安全性。但是,出于本地开发或测试目的,可以使用简单的密码。

在MySQL设置期间启用密码验证将提示系统评估您提供的根密码的强度。然后,服务器将向您介绍密码强度评估。如果您对当前密码感到满意,则可以在提示下输入“是”的“ Y”来进行。此步骤可确保您已经审查了密码强度并在进行设置之前对所选密码满足。

它应该类似于以下输出:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

完成MySQL设置后,脚本将继续剩余的说明。为了确保已成功安装PHP,您可以通过运行以下命令来确认它:

php -v

执行此命令将显示已安装的PHP版本以及相关的详细信息,确认PHP现在正在运行并准备在您的环境中使用。

现在,打开您的Web浏览器并输入服务器的IP地址,该浏览器应取决于您正在工作的环境。如果所有内容都正确设置,则应看到Apache Web服务器正在运行,它将显示默认的Apache Landing页面或您可能已配置的任何其他内容。这证实了Apache正在运行并成功地提供网页。

  • 要验证您可以使用更新的root用户密码访问MySQL控制台,请执行以下命令:
sudo mysql -p

nb:-p标志提示您输入MySQL设置期间设置的密码。提供了正确的密码后,您应该能够登录到MySQL控制台,您可以在其中与MySQL数据库进行管理和交互。

要退出MySQL控制台,只需输入:

exit

这将带您离开MySQL控制台,然后将您返回常规命令提示。

创建虚拟主机

在Apache中创建虚拟主机提供了许多好处,例如在单个服务器上托管多个网站,同时维护每个站点的单独配置。它可以保存IP地址,简化网站管理并通过彼此隔离网站来增强安全性。

虽然不是强制性创建虚拟主机,但这样做是非常有益的,尤其是在处理需要使用Apache服务的多个网站时。我们将创建一个用于学习目的的虚拟主机,因为此过程有助于您熟悉Apache的目录配置,从而使您能够在将来更有效地管理网站。

如果您选择不创建虚拟主机,则可以与位于/var/www/html上的默认目录一起使用。该目录是在Apache Web服务器上托管网站的默认位置。

对于更好的组织,我们将创建一个名为dockertask的目录来容纳项目文件,使管理和服务更容易。

  • 要为dockertask创建目录,请运行以下命令:
sudo mkdir /var/www/dockertask
  • 为了确保适当的所有权和权限,请通过运行以下命令将目录DockerTask分配给当前系统用户:
sudo chown -R $USER:$USER /var/www/projectlamp
sudo chmod -R 755 /var/www/dockertask

这将使您可以在不遇到任何权限问题的情况下处理项目文件。

  • 在Apache的网站中创建并打开一个新的配置文件dockertask.conf
sudo nano /etc/apache2/sites-available/dockertask.conf

这将创建一个新的空白文件。粘贴在以下裸骨配置中,然后执行ctrl+x并输入y,以保存它:

<VirtualHost 192.168.56.2:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/dockertask
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

如果您直接从Linux OS工作,请使用BELO配置:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/dockertask
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  • 在全球设置Servername指令,在文件的顶部或底部添加Servername
sudo nano /etc/apache2/apache2.conf
  • apache2.conf文件的第一行上,添加以下内容:
ServerName 192.168.56.2

如果您直接与Linux OS一起工作,则将Servername作为localhost

在apache中全球设置ServerName表示指定默认服务器名称,该名称将用于任何未明确定义其自己的servername的虚拟主机。

在Apache HTTP服务器中,Servername指令用于定义虚拟主机的主机名和端口号。虚拟主机允许您在同一物理服务器上运行多个网站,并且每个虚拟主机都可以具有自己的Servername,该网站对应于唯一的域或主机名。

  • 使用ls命令确认Apache网站中存在的dockertask.conf文件
sudo ls /etc/apache2/sites-available
  • 输出应类似于以下:
000-default.conf  default-ssl.conf  dockertask.conf
  • 启用新创建的虚拟主机:
sudo a2ensite dockertask

nb:我们需要禁用使用Apache安装的默认网站。如果您不使用自定义域名,则需要这是必需的,因为在这种情况下,Apache的默认配置会覆盖您的虚拟主机。

  • 要禁用Apache的默认网站使用a2dissite命令,请运行以下命令:
sudo a2dissite 000-default
  • 确保配置文件不包含语法错误,请运行:
sudo apache2ctl configtest
  • 输出应类似于以下:
Syntax OK
  • 最后,重新加载apache,因此更改会生效:
sudo systemctl reload apache2

新网站现在处于活动状态,但是Web Root /var/www/dockertask仍然空。

现在,我们将所需的文件夹(form.htmlform_submit.php)从文件存在的主目录中移至此目录

  • 要移动文件,运行以下命令:
sudo mv form.html /var/www/dockertask
sudo mv form_submit.php /var/www/dockertask

默认情况下,Apache优先考虑index.html通过index.php,使其成为应用程序的着陆页。维护后,简单地重命名或删除index.html从文档root恢复常规应用程序页面。

要更改此行为,我们需要编辑/etc/apache2/mods-enabled/dir.conf文件并更改inderex.php文件在DirectoryIndex指令中列出的顺序:

sudo nano /etc/apache2/mods-enabled/dir.conf
  • 将现有配置更改为如下:
<IfModule mod_dir.c>
        #Change this:
        #DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
        #To this:
        DirectoryIndex form.html form_submit.php index.cgi index.pl index.xhtml index.htm
</IfModule>
  • 保存并关闭文件后,重新加载Apache以进行更改以生效:
sudo systemctl reload apache2

设置MySQL数据库

  • 登录MySQL以设置数据库
sudo mysql -u root -p
  • 创建一个新的MySQL用户:

在MySQL Shell中,运行以下查询以创建一个新用户:

CREATE USER 'vagrant'@'192.168.56.2' IDENTIFIED BY 'Strongpassword@123';

nb:您可以为上述选择其他用户和密码。还要记住根据环境更改服务器地址。

  • 向新用户提供授予特权:

接下来,将必要的特权授予新用户并冲洗特权以确保更改立即生效:

GRANT ALL PRIVILEGES ON dev_to.* TO 'vagrant'@'192.168.56.2';
FLUSH PRIVILEGES;

nb:故障排除

如果您在提供密码后遇到了拒绝root用户的访问拒绝错误,请使用this进行故障排除。这是Ubuntu/Linux Systems的常见问题

  • 使用以下SQL命令创建数据库:
create database dev_to;
use dev_to;
create table test(
    id int NOT NULL AUTO_INCREMENT,
    name varchar(255),
    email varchar(255),
    message text,
    PRIMARY KEY (id)
); 
  • 确认创建数据库;
describe test;

您应该看到类似于下面的输出

mysql> describe test;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | YES  |     | NULL    |                |
| email   | varchar(255) | YES  |     | NULL    |                |
| message | text         | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
  • 退出MySQL外壳:
exit

修复MySQL的绑定设置

如果您是从Linux操作系统工作的,则跳过此步骤。

默认情况下,MySQL绑定到本地主机(127.0.0.1)。但是,由于Vagrant Server具有其自己独特的IP地址设置,因此我们必须配置MySQL以绑定到此特定的IP地址。

  • 打开mysql conf的文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
  • 搜索bind-address并将其从0.0.0.0更改为192.168.56.2,保存和退出。

  • 重新启动MySQL Server

sudo service mysql restart

现在,填充到HTML表单中的任何信息都将自动保存在此数据库中。

  • 要运行检查,请登录MySQL数据库
sudo mysql -u root -p
  • 检查现有数据库,并确定我们之前创建的dev_to。一旦找到,我们就可以继续检查驻留在其下方的桌子,包括test表。
SHOW DATABASES;
USE dev_to;
SHOW TABLES;
describe test;
SELECT * FROM test;

结论

在本文中,我们探讨了设置功能齐全的灯泡应用程序的过程,并了解了组件如何相互通信。在下一篇文章中,我们将探讨如何使用Docker来容器化应用程序。