如何在 CentOS 7 上安装 Drupal

Drupal 是全球领先的开源 CMS 平台之一。它灵活,可扩展,可用于构建不同类型的网站,从小型个人博客到大型企业,政治和政府网站都不在话下。

在本教程中,我们说明如何在 CentOS 7 上安装 Drupal 8.6 。

有多种方法可以安装 Drupal 。本指南介绍了使用名为 drupal-project 的项目来安装 Drupal ,drupal-project 是一个 Drupal 项目的 composer 模板。

我们将使用 Nginx 作为 Web 服务器,最新的 PHP 7.2 和 MySQL/MariaDB 作为数据库服务器。

先决条件

在开始安装之前,请确保满足以下先决条件:

创建 MySQL 数据库

第一步是创建新的数据库和用户帐户,并向用户授予适当的权限。

如果您的服务器上已经安装了 MySQLMariaDB ,您可以跳过此步骤,否则您可以通过输入以下内容从 CentOS 的默认软件仓库安装 MariaDB 5.5 服务器软件包:

sudo yum install mariadb-server

对于全新的 MariaDB/MySQL 安装,建议运行 mysql_secure_installation 命令以提高数据库服务器的安全性。

输入以下命令登录 MySQL shell ,并在出现提示时输入密码:

mysql -u root -p

通过运行以下命令来创建数据库(数据库名为 drupal),创建用户(用户名为 drupaluser), 并为用户授予必要的权限

CREATE DATABASE drupal CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES ON drupal.* TO 'drupaluser'@'localhost' IDENTIFIED BY 'change-with-strong-password';

安装 PHP

CentOS 7 附带 PHP 版本 5.4 ,此版本已过时且不再受支持。 Drupal 推荐的 PHP 版本是 PHP 7.2 。

在 CentOS 7 上安装 PHP 7.2 ,我们首先需要启用 EPEL 和 Remi 软件仓库:

sudo yum install epel-release yum-utils
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php72

一旦启用了安装 PHP 7.2 和所有必需的 PHP 扩展软件仓库后,请运行以下命令:

sudo yum install php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl git

我们同时也安装了 PHP FPM ,因为我们将使用 Nginx 作为 Web 服务器。

默认情况下, PHP FPM 将在端口 9000 上以用户身份 apache 运行。我们需要将用户更改为 nginx 并且从 TCP 套接字切换到 Unix 套接字。请打开 /etc/php-fpm.d/www.conf 文件并编辑:

...
user = nginx
...
group = nginx
...
listen = /run/php-fpm/www.sock
...
listen.owner = nginx
listen.group = nginx

使用以下 chown 命令确保目录 /var/lib/php 具有正确的所有权:

sudo chown -R root:nginx /var/lib/php

最后,启用随机自启动并启动 PHP FPM 服务:

sudo systemctl enable php-fpm
sudo systemctl start php-fpm

安装 Composer

Composer 是 PHP 的依赖管理器。我们将下载 Drupal 模板并使用 composer 安装所有必需的 Drupal 组件。

以下命令将通过使用 curl 下载 Composer 安装程序并将文件移动到目录 /usr/local/bin 来全局安装 composer :

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

通过运行以下命令验证安装,该命令将打印 composer 版本:

composer --version

输出应该如下所示:

Composer version 1.8.4 2019-02-11 10:52:10

安装 Drupal

现在,composer 已经安装完成,通过下面的命令,使用 Drupal 模板/var/www/my_drupal 目录里面创建一个新的 Drupal 项目 :

sudo /usr/local/bin/composer create-project drupal-composer/drupal-project:8.x-dev /var/www/my_drupal --stability dev --no-interaction

上面的命令将下载模板,获取所有必需的 php 包并运行准备项目进行安装所需的脚本。该过程可能需要几分钟,如果成功,输出结束将如下所示:

Create a sites/default/settings.php file with chmod 0666
Create a sites/default/files directory with chmod 0777

下一步是使用 Drush 安装 Drupal 。在下面的命令中,要使用我们在第一部分中创建的 MySQL 数据库和用户信息:

cd /var/www/my_drupal
sudo vendor/bin/drush site-install --db-url=mysql://drupaluser:[email protected]/drupal

安装程序将提示您以下消息,只需按 Enter 键继续。

You are about to DROP all tables in your 'drupal' database. Do you want to continue? (yes/no) [yes]:

安装完成后,脚本将打印管理用户名和密码。输出应如下所示:

[notice] Starting Drupal installation. This takes a while.
[success] Installation complete. User name: admin User password: frxka2Db5v

最后,设置正确的权限,以便 Web 服务器可以完全访问站点的文件和目录:

sudo chown -R nginx: /var/www/my_drupal

配置 Nginx

到目前为止,您应该已经在系统上安装了 Nginx 和 SSL 证书,如果没有,请检查本教程的先决条件。

我们将使用官方 Nginx 站点的 Nginx 配方,为我们的新 Drupal 项目创建一个新的服务器块,。

打开文本编辑器并创建以下文件 /etc/nginx/conf.d/example.com

sudo nano /etc/nginx/conf.d/example.com
# Redirect HTTP -> HTTPS
server {
listen 80;
server_name www.example.com example.com;

include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}

# Redirect WWW -> NON WWW
server {
listen 443 ssl http2;
server_name www.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;

return 301 https://example.com$request_uri;
}

server {
listen 443 ssl http2;
server_name example.com;

root /var/www/my_drupal/web;

# SSL parameters
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;

# log files
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ \..*/.*\.php$ {
return 403;
}

location ~ ^/sites/.*/private/ {
return 403;
}

# Block access to scripts in site files directory
location ~ ^/sites/[^/]+/files/.*\.php$ {
deny all;
}

# Block access to "hidden" files and directories whose names begin with a
# period. This includes directories used by version control systems such
# as Subversion or Git to store control files.
location ~ (^|/)\. {
return 403;
}

location / {
try_files $uri /index.php?$query_string;
}

location @rewrite {
rewrite ^/(.*)$ /index.php?q=$1;
}

# Don't allow direct access to PHP files in the vendor directory.
location ~ /vendor/.*\.php$ {
deny all;
return 404;
}


location ~ '\.php$|^/update.php' {
fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
include fastcgi_params;
# Block httpoxy attacks. See https://httpoxy.org/.
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php-fpm/www.sock;
}

# Fighting with Styles? This little gem is amazing.
# location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
try_files $uri @rewrite;
}

# Handle private files through Drupal. Private file's path can come
# with a language prefix.
location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7
try_files $uri /index.php?$query_string;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
try_files $uri @rewrite;
expires max;
log_not_found off;
}

}

不要忘记将 example.com 替换为 Drupal 项目的域名,并设置 SSL 证书文件的正确路径。此配置中使用的片段在本指南中创建。

在重新启动 Nginx 服务之前,请进行测试以确保没有语法错误:

sudo nginx -t

通过输入以下命令重新启动 Nginx 服务以使更改生效:

sudo systemctl restart nginx

测试安装

打开浏览器,输入您的域名,如果安装成功,将出现类似于以下内容的屏幕:

您可以以管理员身份登录并开始自定义新的 Drupal 安装。

安装 Drupal 模块和主题

现在您已经安装了 Drupal 项目,您还需要安装一些模块和主题。 Drupal 模块和主题托管在自定义 composer 存储库上,其中的 drupal-project 让我们开箱即用。

要安装模块或主题,您只需要进入 cd 项目目录并输入 composer require drupal/module_or_theme_name 。例如,如果我们要安装 Pathauto 模块,我们需要运行以下命令:

cd /var/www/my_drupal
sudo -u nginx /usr/local/bin/composer require drupal/pathauto

通过前置 sudo -u nginx 我们以用户身份 nginx 运行命令

Using version ^1.3 for drupal/pathauto
./composer.json has been updated
> DrupalProject\composer\ScriptHandler::checkComposerVersion
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
- Installing drupal/token (1.5.0): Downloading (100%)
- Installing drupal/ctools (3.2.0): Downloading (100%)
- Installing drupal/pathauto (1.3.0): Downloading (100%)
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
> DrupalProject\composer\ScriptHandler::createRequiredFiles

从上面的输出中可以看出, composer 还为我们安装了所有的包依赖项。

更新 Drupal Core

在升级之前,最好备份文件和数据库。您可以使用 备份和迁移 模块,也可以手动备份数据库和文件。

要备份安装文件,可以使用以下 rsync 命令,当然,您需要使用安装目录的正确路径:

sudo rsync -a /var/www/my_drupal/  /var/www/my_drupal_$(date +%F)

要备份数据库,我们可以使用标准 mysqldump 命令:

mysqldump -u root -p > /var/www/my_drupal_database_$(date +%F).sql

或者 drush sql-dump

cd /var/www/my_drupal
vendor/bin/drush sql-dump > /var/www/my_drupal_database_$(date +%F).sql

现在我们创建了一个备份,我们可以通过运行以下命令继续并更新所有 Drupal 核心文件:

sudo -u nginx /usr/local/bin/composer update drupal/core webflo/drupal-core-require-dev symfony/* --with-dependencies

结论

恭喜,您已使用 composer 成功安装了 Drupal 8 ,并学习了如何安装模块和主题。您现在可以开始自定义您的网站了。Drupal 8 用户指南是一个很好的起点,可以了解更多有关如何管理您的 Drupal 安装。另外,不要忘记访问 Github 上的 Drupal Composer 模板项目。