如何在 Ubuntu 18.04 上安装 Drupal

Drupal 是全球最受欢迎的开源 CMS 平台之一。在本教程中,我们将向您展示如何在 Ubuntu 18.04 系统上安装 Drupal 8.5 。

有多种方法可以安装 Drupal 。本教程介绍了安装 Drupal 8.5 所需的步骤,安装过程使用了 composer template for Drupal projects (被称作 drupal-project) 。

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

先决条件

在继续本教程之前,请确保您已满足以下先决条件:

  • 您有一个指向公共服务器 IP 的域名。在本教程中我们将使用 example.com
  • 您已经按照这些说明安装了 Nginx 。
  • 您已为您的域名安装了 SSL 证书。您可以按照这些说明安装免费的 Let’s Encrypt SSL 证书

开始之前

将软件包索引和系统软件包更新到最新版本:

1
sudo apt update && sudo apt upgrade

创建 MySQL 数据库

如果您的服务器上安装了 MySQL 或 MariaDB ,则可以跳过此步骤,否则可以通过输入以下命令从 Ubuntu 的自有软件仓库安装 MySQL 5.7 服务器包:

1
sudo apt install mysql-server

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

现在我们需要登录 MySQL shell 并创建一个新的数据库和用户帐户,并为用户提供适当的授权权限。

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

1
mysql -u root -p

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

1
2
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

PHP 7.2 是 Ubuntu 18.04 中的默认 PHP 版本,是 Drupal 8.5 完全支持并推荐使用的版本。由于我们将使用 Nginx 作为 Web 服务器,我们也将安装 PHP-FPM 。

请运行以下命令安装所有必需的 PHP 模块:

1
sudo apt install php7.2-cli php7.2-fpm php7.2-mysql php7.2-json php7.2-opcache php7.2-mbstring php7.2-xml php7.2-gd php7.2-curl

安装过程完成后, PHP-FPM 服务将自动启动,您可以通过打印服务状态来验证它:

1
systemctl status php7.2-fpm

输出应显示 fpm 服务处于活动状态并正在运行。

1
2
3
4
5
6
7
8
9
10
11
● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-05-19 19:54:13 UTC; 9h ago
Docs: man:php-fpm7.2(8)
Main PID: 17781 (php-fpm7.2)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 507)
CGroup: /system.slice/php7.2-fpm.service
├─17781 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
├─17796 php-fpm: pool www
└─17797 php-fpm: pool www

安装 Composer

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

要全局安装 composer ,请使用 curl 下载 Composer 安装程序并将文件移动到 /usr/local/bin 目录:

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

通过打印 composer 版本验证安装:

1
composer --version

输出应该如下所示:

1
Composer version 1.6.5 2018-05-04 11:44:59

安装 Drupal

现在,我们已经安装了 composer,我们可以继续使用的 composer 模板/var/www/my_drupal 目录里面创建一个新的 Drupal 项目:

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

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

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

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

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

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

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

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

1
2
[notice] Starting Drupal installation. This takes a while. Consider using the --notify global option.
[success] Installation complete. User name: admin User password: XRkC9Q5WN9

最后,我们需要设置正确的权限,以便 Web 服务器可以完全访问站点的文件和目录。 Nginx 和 PHP 都以 www-data 用户和 www-data 组的形式运行,因此我们需要发出以下命令:

1
sudo chown -R www-data: /var/www/my_drupal

配置 Nginx

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

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

打开文本编辑器并创建以下文件:

1
sudo nano /etc/nginx/sites-available/example.com

/etc/nginx/sites-available/example.com 的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# 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/php7.2-fpm.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 证书文件的正确路径。此配置中使用的片段在本指南中创建。

通过创建指向 sites-enabled 目录的符号链接来启用服务器块:

1
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

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

1
sudo nginx -t

如果没有错误,输出应如下所示:

1
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

最后,输入以下命令重启 Nginx 服务:

1
sudo systemctl restart nginx

测试安装

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

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

安装 Drupal 模块和主题

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

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

1
2
cd /var/www/my_drupal
sudo -u www-data composer require drupal/pathauto

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

1
2
3
4
5
6
7
8
9
10
11
12
Using version ^1.2 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.1.0): Downloading (100%)
- Installing drupal/ctools (3.0.0): Downloading (100%)
- Installing drupal/pathauto (1.2.0): Downloading (100%)
Writing lock file
Generating autoload files
> DrupalProject\composer\ScriptHandler::createRequiredFiles

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

更新 Drupal 核心

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

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

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

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

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

或者使用 drush sql-dump

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

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

1
sudo -u www-data composer update drupal/core webflo/drupal-core-require-dev symfony/* --with-dependencies

结论

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