如何使用MySQL HeatWave设置LAMP Stack-第4/5部分

介绍

这是一系列博客中的第四篇,详细介绍了如何在Oracle云中设置和使用利用MySQL HeatWave的LAMP Stack。

  • 第1部分将通过详细说明LAMP Stack是什么以及Oracle云中可用的部署选项来设置场景。它还将阐述本系列博客将构建的LAMP Stack的架构愿景。

  • 第2部分将在Oracle云中构建基础设施(网络、应用服务器、数据库服务器)。

  • 第3部分将安装和配置剩余的LAMP Stack软件。

  • 第4部分(本部分)将安装其他软件,以帮助开发和部署web应用程序。然后,它将安全地部署一个演示PHP应用程序。

  • 第5部分将考虑如何使堆栈更具可伸缩性、可用性和安全性。

完成本博客中任务的谓词

您需要完成本系列博客的第2部分和第3部分。您将需要以下信息:

  • 应用程序服务器的公共IP地址

  • Linux用户帐户名称(在应用程序服务器上)

  • MySQL数据库服务实例的私有IP地址

  • 数据库管理用户的名称和密码

理想情况下,您还可以使用internet域名。拥有其中一个并不是必须的,但如果没有,它将阻止您完成本博客的SSL证书部分。如今,互联网域名每年只需几美元,因此如果你没有域名,你可以考虑购买一个。

用于源代码控制的Git

对于除最琐碎的软件项目之外的任何项目,强烈建议使用源代码控制。如果有多个开发人员参与一个项目,那么有必要进行适当的源代码控制,以便对代码的更改进行适当的管理/合并。

GitHub是使用Git进行软件开发和版本控制的互联网托管提供商。它提供了Git的分布式版本控制和源代码管理(SCM)功能,以及它自己的特性。它为每个项目提供了访问控制和一些协作功能,如错误跟踪、功能请求、任务管理、持续集成和Wiki。

就本博客而言,只需要安装一个Git客户端,但如果您对开发应用程序很认真,那么您应该考虑获得一个Github帐户,以利用前面描述的功能。Github有两种形式:一种是免费使用的社区形式,另一种是订阅的企业形式。

安装git

以opc用户身份登录到应用程序服务器,然后运行以下命令

[opc@app ~]$ sudo dnf -y install git
[opc@app ~]$ git --version
git version 2.31.1
[opc@app ~]$

构建并测试phpdemo应用程序

phpdemo应用程序从MySQL数据库服务实例中提取数据。

步骤1:Clone phpdemo应用程序

首先创建一个临时目录,然后使用git从https://github.com/swdavey/phpdemo.git :

[opc@app ~]$ mkdir –p ~/stage
[opc@app stage]$ cd ~/stage
[opc@app stage]$ git clone https://github.com/swdavey/phpdemo.git
[opc@app stage]$ ls -R
.:
phpdemo
 
./phpdemo:
README.md scripts src
 
./phpdemo/scripts:
createdb.sql getComposer.sh
 
./phpdemo/src:
names.php
[opc@app stage]$

将在临时目录下创建phpdemo目录。在phpdemo中,将有一个自述。md文件和另外两个目录,脚本和src。

脚本目录将包含两个文件:

1.创建数据库。用于创建应用程序模式的sql;

2.getComposer.sh是一个脚本,它将设置一个PHP实用程序,允许轻松下载和安装phpdemo应用程序所依赖的PHP库。

src目录包含一个文件names.php。这是应用程序的源代码:

步骤2.查看源代码names.php

源代码,name.php,具体如下。

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>Names List</h1>
<?php
require_once 'vendor/autoload.php';
 
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__."/../config");
$dotenv->load();
 
$conn = new mysqli($_ENV["DB_HOST"], $_ENV["DB_USER"], $_ENV["DB_PASS"], $_ENV["DB_NAME"]);
if ($conn->connect_error) {
echo "Connection to DB could not be established.";
} else {
$result = $conn->query("SELECT * FROM t1");
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
$conn->close();
}
?>
</body>
</html>

Apache Web服务器将收到此文件(names.php)的http请求。它将识别出请求是针对PHP文件的,并将其转发给PHP引擎。PHP引擎将通过组装静态html部分和PHP代码的(动态)输出来创建动态html文档。

PHP代码位于PHP打开(<PHP?)之间并关闭(?>)标签。代码首先加载dotenv库并创建dotenv对象。此对象从名为../config/的文件中读取数据库凭据。env到应用程序环境中。请注意,.env文件名是隐式的。创建一个mysqli对象并将其分配给变量conn。这提供了与数据库的连接$conn运行一个简单的查询,获取查询结果并将其写入正在创建的html文档。然后关闭连接。动态创建的html文件被返回给Apache,然后Apache将其包装在http响应中,并将其发送回调用者。

步骤3:安装数据库架构

在运行应用程序代码之前,数据库模式需要就位。

使用MySQL Shell连接到数据库并运行createdb。sql脚本。在下面的示例中,用户称为admin,数据库的专用IP地址为10.0.1.66。请自行更改这些值。

[opc@app stage]$ pwd
/home/opc/stage
[opc@app stage]$ cd phpdemo/scripts
[opc@app scripts]$ mysqlsh --uri admin@10.0.1.66 --sql -f createdb.sql
Please provide the password for 'admin@10.0.1.66': *********
 
Records: 4 Duplicates: 0 Warnings: 0
[opc@app scripts]$

该脚本创建了一个模式db1,该模式具有一个表t1,并用4行填充该表,每行具有一个id和一个名称列。此外,它创建一个名为appuser的用户,并为其分配db1模式中对象(即表t1)的select、insert、update和delete权限。该脚本为appuser提供密码。鉴于此密码是公开可用的,因此应进行更改。下面的代码详细说明了这一点。请注意,新密码的长度必须至少为8个字符,并且至少包含一个大写字母、一个数字和一个特殊字符。

[opc@app scripts]$ mysqlsh --uri admin@10.0.1.66 --sql
Please provide the password for 'admin@10.0.1.66': *********
SQL > SELECT user, host FROM mysql.user WHERE user = 'appuser';
+---------+------+
| user | host |
+---------+------+
| appuser | % |
+---------+------+
1 row in set (0.0007 sec)
SQL > ALTER USER 'appuser'@'%' IDENTIFIED BY 'NewPa55w0rd!';
Query OK, 0 rows affected (0.0053 sec)
SQL > \q
Bye!
[opc@app scripts]$

通过登录数据库测试appuser及其密码,并可选地调查db1模式的结构:

[opc@app scripts]$ mysqlsh --uri appuser@10.0.1.66 --sql
Please provide the password for 'appuser@10.0.1.66': *********
SQL > USE db1;
db1 SQL > SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
1 row in set (0.0017 sec)
db1 SQL > DESC t1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(40) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.0017 sec)
db1 SQL > SELECT * FROM t1;
+----+--------+
| id | name |
+----+--------+
| 1 | Fred |
| 2 | Barney |
| 3 | Wilma |
| 4 | Betty |
+----+--------+
4 rows in set (0.0007 sec)
db1 SQL > \q
Bye!
[opc@app scripts]$

步骤4.安全处理数据库凭据

在代码中嵌入数据库凭据会带来安全风险,也会使代码更难维护。因此,凭据和其他敏感数据应始终存储在文件中代码的外部。对于web应用程序,这也意味着不将凭证存储在文档根目录下。

外部存储凭证需要应用程序代码从文件中读取凭证,并使其可被代码中使用凭证的部分访问(例如,用于创建数据库连接)。考虑到这是一个常见的用例,已经创建了软件库,以便开发人员可以重用而不是重写有效的样板代码。

phpdemo应用程序将使用PHP库包vlucas/phpdotenv。这个包通常被PHP开发人员使用,甚至被嵌入到PHP框架中,例如Laravel。

步骤4a:安装composer

Composer是PHP编程语言的应用程序级依赖关系管理器,它为管理PHP软件和所需库(如vlucas/phpdotenv)的依赖关系提供了标准格式。

为了方便起见,包含了一个脚本,可以安全下载composer。下载composer后,应将其重新定位到/usr/local/bin(包含在opc用户的路径变量中),以便易于访问并可用于安装vlucas/phpdotenv。

[opc@app scripts]$ pwd
/home/opc/stage/phpdemo/scripts
[opc@app scripts]$ ls -l
total 8
-rw-rw-r--. 1 opc opc 366 Jul 7 13:06 createdb.sql
-rw-rw-r--. 1 opc opc 483 Jul 7 10:38 getComposer.sh
[opc@app scripts]$ chmod 0744 getComposer.sh
[opc@app scripts]$ ls -l
total 8
-rw-rw-r--. 1 opc opc 366 Jul 7 13:06 createdb.sql
-rwxr--r--. 1 opc opc 483 Jul 7 10:38 getComposer.sh
[opc@app scripts]$ ./getComposer.sh
[opc@app scripts]$ ls -l
total 2668
-rwxr-xr-x. 1 opc opc 2720967 Jul 8 08:43 composer.phar
-rw-rw-r--. 1 opc opc 366 Jul 7 13:06 createdb.sql
-rwxr--r--. 1 opc opc 483 Jul 7 10:38 getComposer.sh
[opc@app scripts]$ sudo mv composer.phar /usr/local/bin/composer
[opc@app scripts]$ ls -l /usr/local/bin/composer
-rwxr-xr-x. 1 opc opc 2720967 Jul 8 08:43 /usr/local/bin/composer
[opc@app scripts]$

步骤4b:下载并安装vlucas/phpdotenv软件包

导航到源位置,然后运行composer require命令:

[opc@app scripts]$ pwd
/home/opc/stage/phpdemo/scripts
[opc@app scripts]$ cd ../src
[opc@app src]$ ls
names.php
[opc@app src]$ composer require vlucas/phpdotenv
[opc@app src]$ ls -l
total 28
-rw-rw-r--. 1 opc opc 62 Jul 11 13:53 composer.json
-rw-rw-r--. 1 opc opc 16790 Jul 11 13:53 composer.lock
-rw-rw-r--. 1 opc opc 752 Jul 7 10:38 names.php
drwxrwxr-x. 7 opc opc 111 Jul 11 13:53 vendor
[opc@app src]$

步骤5:创建dotenv配置文件

配置文件将托管在文档根目录之外的目录中。源代码,name.php,详细说明了实现此目的的相对路径,./…/config,表示dotenv文件,.env将位于名为config的目录中,该目录与源文件所在的目录相距一个目录。创建此目录结构,然后创建并填充.env,如下所示。在您自己的值中替换DB_HOST和DB_PASS(即MySQL数据库服务实例的私有IP地址和appuser的密码)。

[opc@app src]$ pwd
/home/opc/stage/phpdemo/src
[opc@app src]$ mkdir -p ./../config
[opc@app src]$ cd ./../config
[opc@app config]$ cat << EOF >> .env
DB_HOST="10.0.1.66"
DB_USER="appuser"
DB_PASS="Welcome1!"
DB_NAME="db1"
EOF
[opc@app config]$

步骤6:测试应用程序(使用php)

更改到src目录,然后使用php调用应用程序:

[opc@app config]$ pwd
/home/opc/stage/phpdemo/config
[opc@app config]$ cd ../src
[opc@app src]$ php -f names.php
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>Names List</h1>
Fred<br>Barney<br>Wilma<br>Betty<br></body>
</html>
[opc@app src]$

输出应该是包含db1模式t1表中名称的html文件的文本。如果您看到上面的输出,则代码正常工作。

步骤7.部署应用程序

将使用最基本的部署形式:手动将代码及其依赖项复制到Web服务器的文档根目录。如果本博客鼓励您使用LAMP堆栈进一步开发web应用程序,则建议您使用框架(如Lavarel、Symfony等)和/或CI/CD软件(如Jenkins),因为这两种软件都可以加速开发和自动化部署。

需要从src目录复制到文档根目录(/var/www/html)的文件包括名称。php和目录、供应商及其内容。此外,…/config目录及其内容(即dotenv文件,.env)也需要复制,但必须部署在文档根目录之外(即/var/www/config):

[opc@app src]$ pwd
/home/opc/stage/phpdemo/src
[opc@app src]$ ls -l
total 28
-rw-rw-r--. 1 opc opc 62 Jul 8 09:34 composer.json
-rw-rw-r--. 1 opc opc 16790 Jul 8 09:34 composer.lock
-rw-rw-r--. 1 opc opc 752 Jul 7 10:38 names.php
drwxrwxr-x. 7 opc opc 111 Jul 8 09:34 vendor
[opc@app src]$ sudo cp names.php /var/www/html
[opc@app src]$ sudo cp -R vendor /var/www/html
[opc@app src]$ cd ..
[opc@app phpdemo]$ sudo cp -R config /var/www
[opc@app phpdemo]$

步骤7a:配置selinux

默认情况下,在Oracle Linux上启用Selinux。selinux的默认规则之一是防止Apache对数据库进行远程调用。因此,在从应用程序服务器访问数据库之前,必须对此规则进行例外:

[opc@app src]$ sudo setsebool -P httpd_can_network_connect_db 1
[opc@app src]$ sudo systemctl restart httpd
[opc@app src]$

请注意,必须重新启动Apache才能获取更改。配置selinux的不太安全的替代方案包括使其成为许可或完全禁用。

步骤8.测试应用程序(使用浏览器)

在web浏览器中输入http:///names.php。您应该看到一个类似于下面的页面:

使用Encrypt提供SSL功能

到目前为止,Apache仅通过http提供内容。Http以明文传输:它不加密数据,因此很容易被窃取。Https通过使用安全套接字层(SSL)证书来解决此问题,该证书用于在服务器和客户端程序(例如浏览器)之间创建安全加密连接。Https也由传输层安全(TLS)协议保护。TLS有助于提供数据完整性。它有助于防止数据传输被修改或损坏,并提供身份验证——向用户证明他们正在与预期网站通信。

Apache已经安装了使用TLS/SSL的功能(请参阅第2部分)。但是,要使用此功能,需要证书。可能会创建并使用自签名证书。但是,自签名证书的问题是浏览器无法对其进行身份验证。这会导致用户首次尝试从web服务器访问网页时发出警告通知。这可能不是开发的问题,但在生产过程中,任何潜在用户/客户都可能会注意到警告,而不会进入现场。这个问题只有一种解决方案,那就是使用由可信证书颁发机构(CA)颁发的证书。对于个人和初创企业来说,这可能是一个问题:首先是成本方面,其次,由于这些组织可能会对身份和贸易地位提出要求,因此很难与这些组织进行贸易。如果您拥有一个域,那么您的域提供商可能能够免费为您的网站提供CA证书。然而,一些供应商可能会规定,除非您向他们支付一些钱,否则它不能用于商业目的。为了解决这些问题,成立了一个名为“Let’s Encrypt”的组织。Let’s Encrypt是一个由非营利互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构。为了利用Let’s Encrypt,您所需要的就是拥有一个有效的域名和电子邮件地址。理想情况下,您的网站应该作为虚拟主机运行。

下面的步骤描述了如何从以明文方式提供页面更改为使用TLS/SSL和Let’s Encrypt证书。

步骤1:将应用程序服务器的公共IP地址分配给您的域

这涉及登录到您与域提供商的帐户,并编辑您的域的DNS记录。您的域提供商应该能够告诉您如何做到这一点,但通常所涉及的只是编辑您的域的web流量(www)的(IPv4)DNS记录,以便它映射到您的应用程序服务器的IP地址。

步骤2:创建虚拟主机

为了正确管理让我们加密证书,稍后将安装Certbot客户端。For Certbot要求使用Apache虚拟主机。

虚拟主机是Apache配置指令,允许您在单个服务器上运行多个网站。使用虚拟主机,您可以指定站点文档根目录(包含站点文件的目录),为每个站点创建单独的安全策略,使用不同的SSL证书,等等。

要创建虚拟主机,请执行下面详述的命令。需要注意的几点:

1.示例假设一个名为www.mydomain.com的域。使用您自己的域名编辑示例。

2.域名用于形成目录结构。这样做并不是必须的,但如果您打算托管多个网站(每个网站都有自己的域名或子域名),那么这将创建一个自文档结构。

3.使用端口80是因为Certbot/Let’s Encrypt需要使用此端口来验证所使用的域名是否有效。当Certbot安装Let’s Encrypt证书时,它会将一些URL重写代码附加到此配置文件,该配置文件会将URL重定向到端口443上的虚拟主机(Certbot将自动创建此虚拟主机文件)。

[opc@app src]$ sudo mkdir /var/www/mydomain.com
[opc@app src]$ sudo mkdir /var/www/mydomain.com/html
[opc@app src]$ sudo mkdir /var/www/mydomain.com/log
[opc@app src]$ sudo mkdir /var/www/mydomain.com/config
[opc@app src]$ sudo -s
[opc@app src]# cat << EOF >> /etc/httpd/conf.d/mydomain.com.conf
<VirtualHost *:80>
ServerName www.mydomain.com
ServerAlias www.mydomain.com
DocumentRoot /var/www/mydomain.com/html
ErrorLog /var/www/mydomain.com/log/error.log
CustomLog /var/www/mydomain.com/log/requests.log combined
</VirtualHost>
EOF
[opc@app src]# exit
[opc@app src]$

步骤3:配置selinux

默认情况下,selinux策略仅允许Apache使用其默认目录,例如:/var/www/html(主服务器的文档根目录)和/var/log/httpd进行日志记录。对于虚拟主机,几乎肯定会使用其他目录,因此需要更改Apache的selinux策略。

Apache有许多策略(参见man-httpd_selinux),但最常用的策略是:

  • httpd_sys_content_t

    • Apache使用的只读目录和文件
  • httpd_sys_rw_content_t

    • Apache使用的可读写目录和文件。将其分配给应用程序可以创建或修改文件的目录,或将其分配到文件目录以允许应用程序修改它们。
  • httpd_log_t

    • Apache用于生成并附加到web应用程序日志文件。
  • htppd_cache_t

    • 如果使用mod_cache,则分配给Apache用于缓存的目录。

目的是将phpdemo应用程序移动到虚拟主机。鉴于这是一个如此简单的应用,只需要考虑策略httpd_sys_content_t和httpd-log_t:

[opc@app src]$ sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/mydomain.com/html(/.*)?"
[opc@app src]$ sudo semanage fcontext -a -t httpd_log_t "/var/www/mydomain.com/log(/.*)?"
[opc@app src]$ sudo restorecon -R -v /var/www/mydomain.com
Relabeled /var/www/mydomain.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
[opc@app src]$

第一个semanagefcontext命令设置一个策略,允许Apache(httpd)将内容写入文档根目录及其下的任何目录。第二个命令设置允许Apache(httpd)登录到非默认日志目录的策略。restorecon命令应用semanagefcontext所做的更改。

步骤4:安装Let’s Encrypt证书

Certbot是一个免费的开源软件工具,用于自动使用手动管理的网站上的Let’s Encrypt证书来启用HTTPS。Certbot是使用snap安装的。Snap不是Oracle Linux发行版的一部分,因此需要首先安装。Snap还依赖于Linux epel包:

[opc@app src]$ sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
[opc@app src]$ sudo dnf -y install snapd
[opc@app src]$ sudo systemctl enable --now snapd.socket
[opc@app src]$ sudo ln -s /var/lib/snapd/snap /snap
[opc@app src]$ sudo snap install core
[opc@app src]$

安装core时,可能会出现类似以下错误:

error: too early for operation, device not yet seeded or device model not acknowledged

如果是,请等待几秒钟,然后重新运行命令。

现在可以安装Certbot:

[opc@app src]$ sudo snap install --classic certbot
[opc@app src]$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
[opc@app src]$

安装证书(所有条目必须有效-没有虚构的电子邮件地址等)

[opc@app src]$ sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): john.doe@xyz.com
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.
 
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: www.mydomain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for www.mydomain.com
 
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.mydomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.mydomain.com/privkey.pem
This certificate expires on 2022-10-13.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
 
Deploying certificate
Successfully deployed certificate for www.mydomain.com to /etc/httpd/conf.d/mydomain.com-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://www.mydomain.com
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[opc@app src]$

必须重新启动Apache:

[opc@app src]$ sudo systemctl restart httpd
[opc@app src]$

步骤5:测试TLS/SSL使用情况

目前,尚未将任何文件部署到虚拟主机的文档根目录,因此Web服务器无法提供任何服务。要解决此问题,请移动原始索引。从主服务器的文档根目录到虚拟主机的html文件,然后使用浏览器进行测试:

[opc@app src]$ sudo mv /var/www/html/index.html /var/www/mydomain.com/html
[opc@app src]$

在上面的图片中,chrome浏览器通过在选项卡中显示URL(即协议为https)和在搜索栏中显示安全符号(挂锁)(以前的协议为http,搜索栏中有一个警告三角形,上面写着“不安全”)来表示TLS/SSL正在使用。

[opc@app src]$ sudo mv /var/www/html/names.php /var/www/mydomain.com/html
[opc@app src]$ sudo mv /var/www/html/vendor /var/www/mydomain.com/html
[opc@app src]$ sudo mv /var/www/config /var/www/mydomain.com
[opc@app src]$

步骤6:测试证书更新

Certbot将自动续订证书。但是,值得进行一次试运行,以确保没有任何东西阻止此过程:

[opc@app src]$ sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/www.mydomain.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for www.mydomain.com
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/www.mydomain.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[opc@app src]$

总结和下一步

如果您遵循了本博客中的所有步骤和前面的步骤,那么您就有了一个工作的LAMP Stack,可以通过SSL/TLS安全地提供网页和PHP内容。在本系列中开发的堆栈可以被视为开发Stack。本系列的下一篇博客将讨论如何随着需求增长进入生产并扩展Stack。

原文标题:How to Setup a LAMP Stack with MySQL HeatWave – Part 4/5
原文作者:Stuart Davey
原文链接:https://blogs.oracle.com/mysql/post/how-to-setup-a-lamp-stack-with-mysql-heatwave-part4


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论