如何在FreeBSD10.1上安装Nginx、MySQL和PHP(FEMP)堆栈

来自菜鸟教程
跳转至:导航、​搜索

介绍

Nginx、MySQL 和 PHP 可以轻松组合在一起,作为在 Web 上提供动态内容的强大解决方案。 这三个软件可以在 FreeBSD 机器上安装和配置,以创建所谓的 FEMP 堆栈

在本指南中,我们将演示如何在 FreeBSD 10.1 服务器上安装 FEMP 堆栈。 我们将使用软件包安装软件,以便更快地启动和运行。 这些包提供了适用于大多数服务器的合理默认值。

安装组件

首先,我们将使用 FreeBSD 软件包系统安装我们需要的所有软件。 “安装”命令将更新可用包的本地副本,然后安装我们请求的包:

sudo pkg install nginx mysql56-server php56 php56-mysql

这将下载并安装一个 Nginx Web 服务器来提供我们的内容,一个用于存储信息的 MySQL 数据库服务器,以及一个用于处理动态内容的 PHP 处理语言。

安装完成后,如果您正在运行默认的 tcsh shell,请确保运行 rehash 命令。 这使 shell 知道您安装的新应用程序:

rehash

完成后,您可以继续开始启用和配置您的组件。

启用所有服务

在上一节中,我们下载了三个需要在我们的服务器上运行的独立服务。

为了让 FreeBSD 将这些作为常规服务启动,我们需要告诉 FreeBSD 我们想要启用它们。 这将允许我们将它们作为服务而不是一次性应用程序来处理,它还将配置 FreeBSD 以在启动时自动启动它们。

首先,我们需要知道为每个服务设置正确的 rc 参数。 位于 /usr/local/etc/rc.d 目录中的服务脚本定义了应该用于使用 rcvar 变量启用每个服务器的参数。 我们可以通过键入以下内容来查看每个服务的 rcvar 设置为:

grep rcvar /usr/local/etc/rc.d/*

你应该得到这样的列表:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/mysql-server:rcvar=mysql_enable
/usr/local/etc/rc.d/nginx:rcvar=nginx_enable
/usr/local/etc/rc.d/php-fpm:rcvar=php_fpm_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

如您所见,这使我们可以轻松地输出我们需要为每个服务设置的参数。 脚本本身的名称(直到冒号字符的路径的最后一个组成部分)也值得注意,因为它告诉我们 FreeBSD 用于服务的实际名称。

要启用这些服务,我们将使用 sudo 权限编辑 /etc/rc.conf 文件:

sudo vi /etc/rc.conf

在里面,我们将为我们希望启动的每个服务添加一行。 我们可以使用我们为每个服务发现的 rcvar 参数并将其设置为“YES”以启用每个服务:

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

完成后保存并关闭文件。

配置 PHP

接下来,我们将配置我们的 PHP-FPM 服务,该服务将负责处理从我们的 Web 服务器发送的 PHP 请求。

首先,切换到 /usr/local/etc 目录,其中存储了我们的可选程序的配置文件:

cd /usr/local/etc

在这个目录中有许多我们想要修改的 PHP 配置文件。 我们将从 PHP-FPM 配置文件本身开始。 使用 sudo 权限打开它:

sudo vi php-fpm.conf

在里面,我们要调整几个不同的选项。 首先,我们要配置 PHP-FPM 使用 Unix 套接字而不是网络端口进行通信。 这对于在单个服务器内通信的服务更安全。

找到如下所示的行:

listen = 127.0.0.1:9000

将其更改为使用 /var/run 目录中的套接字:

listen = /var/run/php-fpm.sock

接下来,我们将配置将要创建的套接字的所有者、组和权限集。 有一组注释掉的选项可以处理这个配置,如下所示:

;listen.owner = www
;listen.group = www
;listen.mode = 0660

通过删除开头的注释标记来启用这些:

listen.owner = www
listen.group = www
listen.mode = 0660

完成后保存并关闭文件。

接下来,我们需要创建一个 php.ini 文件来配置 PHP 的一般行为。 包含两个示例文件,我们可以选择将它们复制到 PHP 读取的 php.ini 文件中。

php.ini-production 文件将更接近我们需要的文件,因此我们将使用该文件。 将生产版本复制到 PHP 检查的文件中:

sudo cp php.ini-production php.ini

使用 sudo 权限打开文件进行编辑:

sudo vi php.ini

在里面,我们需要找到一个配置 cgi.fix_pathinfo 行为的部分。 它将被注释掉并默认设置为“1”。 我们需要取消注释并将其设置为“0”。 如果未找到传入进程的文件,这将阻止 PHP 尝试执行部分路径。 如果我们不阻止这种行为,恶意用户可能会使用它来执行任意代码。

取消注释 cig.fix_pathinfo 行并将其设置为“0”:

cgi.fix_pathinfo=0

完成后保存并关闭文件。

现在我们已经完全配置了 PHP-FPM,我们可以通过键入以下内容来启动服务:

sudo service php-fpm start

我们现在可以继续配置我们的 MySQL 实例。

配置 MySQL

要开始配置 MySQL,我们需要启动 MySQL 服务:

sudo service mysql-server start

第一次运行此命令时,它将在文件系统中创建所需的目录结构并安装所需的数据库文件。 然后它将启动 MySQL 服务器进程。

服务启动后,我们需要保护安装。 这可以通过一个名为 mysql_secure_installation 的脚本来完成。 使用 sudo 权限运行它以锁定一些不安全的默认值:

sudo mysql_secure_installation
. . .

Enter current password for root (enter for none):

该脚本将首先询问您 MySQL root 帐户的当前密码。 由于我们还没有为这个用户设置密码,我们可以按“ENTER”绕过这个提示。

Set root password? [Y/n]

接下来,它会询问您是否要设置 MySQL root 帐户的密码。 按“ENTER”接受此建议。 选择并确认管理密码。

然后,该脚本将继续执行其他建议,这些建议将有助于扭转默认 MySQL 安装中的一些不安全条件。 只需在所有这些提示中按“ENTER”即可完成所有建议的操作。

我们可以重新启动 MySQL 服务以确保我们的实例立即实施安全更改:

sudo service mysql-server restart

我们的 MySQL 实例现在已经启动并按照我们想要的方式运行,所以我们可以继续前进。

配置 Nginx

我们的下一个任务是设置 Nginx。 首先,我们需要启动 Web 服务器:

sudo service nginx start

现在,我们可以通过转到 /usr/local/etc 目录中的 nginx 目录来开始配置 Nginx:

cd /usr/local/etc/nginx

在这里,我们需要以 sudo 权限打开 Nginx 主配置文件:

sudo vi nginx.conf

在内部,我们可以开始进行更改,以便我们的 Nginx 实例可以与我们的其他组件一起使用。

首先,取消注释并修改文件顶部的 user 指令。 我们需要 Web 服务器以 [X41X] 用户身份运行,因为这是我们的 PHP-FPM 实例正在寻找的:

user www;

我们还应该将 worker_processes 设置为系统拥有的 CPU 或内核数。 (要了解您的服务器有多少 CPU,请从命令行输入 sysctl hw.ncpu):

worker_processes 2;

接下来,我们将使用 error_log 指令设置错误详细程度和位置。 我们将在 info 日志级别记录到 /var/log/nginx/error.log 的位置:

error_log /var/log/nginx/error.log info;

http 块中,我们还将设置访问日志。 这将位于 /var/log/nginx/access.log

access_log /var/log/nginx/access.log;

server 块中,我们需要修改 server_name 指令以使用我们服务器的域名或 IP 地址。 我们可以让我们的服务器响应 www 主机名,也可以通过在主域之后添加:

server {
    listen          80;
    server_name     example.com www.example.com;

    . . .

在主 server 块中配置 rootindex 指令。 我们的文档根目录是 /usr/local/www/nginx 并且我们的 index 指令应该在返回 index.htmlindex.htm 文件之前尝试提供 index.php 文件。

由于我们在 server 上下文中定义了这些指令,因此我们不需要在 location / 块中使用它们。 在此块中,我们将改为配置 try_files 指令,以尝试将用户请求作为文件和目录提供服务,然后返回 404 错误:

server {

    . . .

    root /usr/local/www/nginx;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    . . .

最后,我们需要配置一个处理 PHP 文件的位置块。 该块将匹配任何以 .php 结尾的请求。 它只会处理文件本身,如果找不到文件,则会返回 404 错误。

我们将使用之前在 php-fpm.conf 文件中配置的套接字。 我们还将配置一些其他 FastCGI 代理选项,部分是通过从 fastcgi_params 文件中读取参数。 我们需要显式设置 SCRIPT_FILENAME 参数,以便 PHP 知道要执行哪些文件:

server {

    . . .

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }

总之,删除注释后,文件应如下所示:

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  example.com www.example.com;
        root /usr/local/www/nginx;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

完成后保存并关闭文件。

我们现在需要创建我们在文件中引用的日志目录和文件。 首先,创建/var/log/nginx目录:

sudo mkdir -p /var/log/nginx

接下来,我们可以创建空日志文件:

sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log

现在,我们准备好配置我们的文档根目录。 我们已将根目录配置为 /usr/local/www/nginx,但目前,这是指向 /usr/local/www/nginx-dist 目录的符号链接,将来可以通过打包操作进行更新。

我们应该销毁链接并再次创建未链接的目录:

sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx

由于我们仍然需要测试我们的 Web 服务器,我们可以将 index.html 文件复制到我们的新 Web 根目录中:

sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx

当我们在这里时,我们还应该创建一个临时的 info.php 文件,我们可以使用它来测试 Nginx 将请求传递给 PHP-FPM 的能力。 在具有 sudo 权限的文档根目录中创建文件:

sudo vi /usr/local/www/nginx/info.php

在文件中,键入以下内容。 这将生成一个 HTML 页面,其中包含有关我们的 PHP 配置的信息:

<?php phpinfo(); ?>

完成后保存并关闭文件。

我们现在准备重启 Nginx 以利用我们的新配置。 首先,通过键入以下内容来测试配置文件的语法错误:

sudo nginx -t

如果您的配置文件没有可检测到的语法错误,您应该会看到如下所示的内容:

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

如果上述命令返回错误,请重新打开 Nginx 配置文件到发现错误的位置并尝试修复问题。

当您的配置检查正确时,我们可以重新启动 Nginx:

sudo service nginx restart

测试结果

我们的网络堆栈现已完成。 我们剩下要做的就是测试它。

在您的网络浏览器中,首先转到您的基本域名或服务器的 IP 地址:

http://example.com

您应该会看到我们复制过来的 index.html 文件的内容。 它看起来像这样:

这表明 Nginx 已启动并正在运行,并且能够提供简单的 HTML 页面。

接下来,我们应该查看我们创建的 info.php 文件。 在您的浏览器中,访问您的域名或服务器 IP 地址,然后是 /info.php

http://example.com/info.php

您应该会看到一个生成的 PHP 信息页面,如下所示:

如果你能看到这个页面,你已经成功地在你的 FreeBSD 服务器上配置了一个 FEMP 栈。

测试配置后,最好从文档根目录中删除 info.php 文件,因为它会泄露一些有关安装的敏感信息:

sudo rm /usr/local/www/nginx/info.php

您可以随时轻松地在以后重新创建此文件。

结论

您现在应该拥有一个由 Nginx 提供支持的功能齐全的 Web 服务器,它可以处理动态 PHP 内容并使用 MySQL 存储数据。 此配置可用作各种其他配置和 Web 应用程序的基础。