在安装完Ubuntu 16.04后,搭建nginx + PHP7.2环境的步骤如下:

翻译了以下的目的,推荐直译:“目标”

為了將共享租用的 WordPress 遷移到 VPS 之前的準備工作。
考慮到將來從 WordPress 遷移到 Ruby on Rails,我們決定使用 nginx 作為 Web 伺服器。

服务器操作系统

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"

据说 CentOS 是更常用的服务器操作系统,但由于熟悉 Ubuntu,所以选择了 Ubuntu Server。

任务的内容

0. SSH 连接的安全措施

由于VPS的SSH连接在初始状态下过于脆弱,因此我们首先采取了安全防护措施。

※由于与本文的主题有些偏离,所以另开一篇文章进行讨论。

1. 安装nginx

可以从Ubuntu的初始软件源进行安装,但是那是一个旧版本,建议从官方的nginx软件源进行安装。

$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ sudo apt-get update
$ sudo apt-get install nginx

2. MySQL 安装

如果只是搭建PHP环境的话,可以不必要,但是因为之后要安装WordPress,所以在这个时候进行安装。

$ sudo apt-get install mysql-server

如果在初始状态下,服务器内部使用的字符编码为latin1 (iso8859-1),那么输入包含日语的数据时会出现乱码。

$ sudo mysql -u root
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper

Connection id: 4
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.21-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 3 hours 4 min 41 sec

Threads: 1 Questions: 9 Slow queries: 0 Opens: 107 Flush tables: 1 Open tables: 26 Queries per second avg: 0.000
--------------

修改MySQL的配置文件,将字符集设为UTF-8。

[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
default-storage-engine=INNODB

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

重新启动MySQL服务器。

$ sudo /etc/init.d/mysql restart

确认文字编码已更改为UTF-8。

$ sudo mysql -u root
mysql> status
--------------
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper

Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.21-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 11 sec

Threads: 1 Questions: 7 Slow queries: 0 Opens: 107 Flush tables: 1 Open tables: 26 Queries per second avg: 0.636
--------------

3. 安装 PHP 7.2

由于初期版本库的最新版本是7.0,所以添加了库并进行了安装。同时还安装了PHP-FPM。

# add-apt-repository ppa:ondrej/php
# apt-get update
# apt-get install php7.2 php7.2-fpm php7.2-mysql php7.2-mbstring php7.2-zip

在 `/etc/php/7.2/cli/php.ini` 和 `/etc/php/7.2/fpm/php.ini` 这两个文件中添加以下设置。

cgi.fix_pathinfo=0
date.timezone = "Asia/Tokyo"

由于还有与 Nginx 相关的 PHP-FPM 配置,因此现在不会重新启动服务。

4. Nginx和PHP-FPM的配置。

进行Nginx与PHP-FPM(一种PHP的FastCGI实现)之间的协作配置。

根据需要备份设置文件。

# cp -p /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org
# cp -p /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/www.conf.org

nginx的配置文件

server {
  listen 80;
  server_name example.com;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm index.php;
  }

  location ~ \.php$ {
    root /usr/share/nginx/html;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

  location ~ /\.ht {
    deny all;
  }
}

我想在安装WordPress时进行修改,但首先我希望将其运行起来,所以按照上述进行设置。

可以使用 fastcgi_pass 127.0.0.1:9000 这个选项,但据说相较于 TCP socket,UNIX 域套接字更加高效,所以我将其设置为 unix:/run/php/php7.2-fpm.sock。

PHP-FPM 的配置选项

将用户和组的设置从www-data更改为nginx。

user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx

重新启动服务

重新启动Nginx和PHP-FPM服务。

# systemctl restart nginx.service
# systemctl restart php7.2-fpm.service

服务的自动启动设置

设置操作系统启动时自动启动nginx和PHP-FPM。

# systemctl enable nginx.service
Synchronizing state of nginx.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable nginx
# systemctl enable php7.2-fpm.service
Synchronizing state of php7.2-fpm.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable php7.2-fpm

5. 设置文档根目录的权限。

为了使Nginx和登录用户(通常使用的用户)可以访问文档根目录下的内容,需要更改权限设置。

将登录用户添加到nginx组中

# usermod -aG nginx foo
# id foo
uid=1000(foo) gid=1000(foo) groups=1000(foo),27(sudo),121(nginx)

更改文件根目录的所有者、组和访问权限。

nginx 的文档根目录(/usr/share/nginx/html)的所有者/群组可以保持为 root,是可以的。

为了让nginx和登录用户可以访问文档根目录内的文件,需要将所有者/组更改为nginx,并更改访问权限。

# chown -R nginx:nginx /usr/share/nginx/html/*
# find /usr/share/nginx/html -type f -exec chmod 664 {} \;

请确认权限已经正确修改。

# ls -l /usr/share/nginx/html
total 8
-rw-rw-r-- 1 nginx nginx 537 Oct 17 22:16 50x.html
-rw-rw-r-- 1 nginx nginx 612 Oct 17 22:16 index.html

6. 其他设置(可选)

创建文档根目录的符号链接

在登录用户的主目录下创建 DocumentRoot 的符号链接。

$ ln -s /usr/share/nginx/html ~/www

确认工作进行中

在 /usr/share/nginx/html 的直接子目录中创建 index.php。

<?php phpinfo(); ?>

当我从Web浏览器访问 http://[IP地址]/index.php ,PHP的配置信息正常地被输出。

因为命名服务器尚未更改完成,所以在 URL 中指定了 IP 地址。

请参考以下网站。

在Ubuntu上安装最新版的nginx。
在Ubuntu上安装MySQL。
在Ubuntu 16.04上使用Nginx安装PHP 7.1。
关于在Ubuntu上安装Nginx的备忘录(从GitHub迁移)。
关于Nginx的公开目录权限。
批量更改权限和所有者。