如何在 FreeBSD 10.1 上安装 Nginx、MySQL 和 PHP (FEMP) 协议栈

介绍

Nginx、MySQL 和 PHP 可以很容易地结合在一起作为一个强大的解决方案,用于在 Web 上提供动态内容. 这些三种软件可以安装和配置在 FreeBSD 机器上,以创建被称为 FEMP 堆栈

在本指南中,我们将展示如何在 FreeBSD 10.1 服务器上安装 FEMP 堆栈. 我们将使用软件包来安装该软件,以便更快地运行。

<$>[注] 注: 截至 2022 年 7 月 1 日,DigitalOcean 不再支持通过控制面板或 API 创建新的 FreeBSD Droplets。

安装组件

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

1sudo pkg install nginx mysql56-server php56 php56-mysql

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

一旦安装完成,请确保运行rehash命令,如果您正在运行默认的tcsh壳。

1rehash

当您完成时,您可以继续启用和配置您的组件。

启用所有服务

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

为了让 FreeBSD 开始使用这些作为传统服务,我们需要告诉 FreeBSD 我们想要启用它们,这将使我们能够将它们作为服务而不是一次性应用程序来处理,并且还会将 FreeBSD 配置为在启动时自动启动。

首先,我们需要知道每个服务设置的正确rc参数。服务脚本位于 /usr/local/etc/rc.d 目录中,定义应该用来启用每个服务器使用 rcvar` 变量的参数。

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

你应该得到这样的列表:

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

正如你所看到的,这使我们能够轻松地输出我们需要为每个服务设置的参数. 脚本的名称本身(路径的最后组成部分直到结尾符号)也是显而易见的,因为它告诉我们FreeBSD用于服务的实际名称。

为了启用这些服务,我们将用 sudo 特权编辑 /etc/rc.conf 文件:

1sudo vi /etc/rc.conf

我们可以使用我们为每个服务发现的rcvar参数,并将其设置为YES以启用每个服务:

1mysql_enable="YES"
2nginx_enable="YES"
3php_fpm_enable="YES"

保存并关闭文件,当你完成。

配置 PHP

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

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

1cd /usr/local/etc

这个目录中有许多PHP配置文件,我们将想要修改,我们将从PHP-FPM配置文件本身开始。

1sudo vi php-fpm.conf

首先,我们要配置 PHP-FPM 以使用 Unix 接口而不是网络端口进行通信。

找到看起来像这样的线条:

1listen = 127.0.0.1:9000

更改此,以在 /var/run 目录中使用接口:

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

接下来,我们将配置所要创建的插件的所有者、组和权限集。

1;listen.owner = www
2;listen.group = www
3;listen.mode = 0660

通过在开始时删除评论标记来启用这些:

1listen.owner = www
2listen.group = www
3listen.mode = 0660

保存并关闭文件,当你完成。

接下来,我们需要创建一个php.ini文件,该文件将配置PHP的一般行为. 包括两个样本文件,我们可以选择将其复制到PHP读到的php.ini文件。

php.ini-production文件将更接近我们所需要的,所以我们将使用它。

1sudo cp php.ini-production php.ini

打开文件以sudo特权进行编辑:

1sudo vi php.ini

内部,我们需要找到一个配置cgi.fix_pathinfo行为的部分,它将被评论并默认设置为1。我们需要放弃评论并将其设置为0。这将防止PHP尝试执行路径的部分,如果没有找到传入进程的文件,这可能会被恶意用户用来执行任意代码,如果我们不防止这种行为。

删除cig.fix_pathinfo行并将其设置为0:

1cgi.fix_pathinfo=0

保存并关闭文件,当你完成。

现在我们已经完全配置了 PHP-FPM,我们可以通过键入开始服务:

1sudo service php-fpm start

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

配置思维

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

1sudo service mysql-server start

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

服务启动后,我们需要确保安装。这可以通过一个名为mysql_secure_installation的脚本来完成。 使用sudo特权来执行此操作,以锁定一些不安全的默认功能:

1sudo mysql_secure_installation
1. . .
2
3Enter current password for root (enter for none):

该脚本将通过向您请求当前的MySQL根帐户密码开始,因为我们还没有为这个用户设置密码,我们可以按ENTER来绕过这个提示。

1Set root password? [Y/n]

接下来,它会问你是否想设置 MySQL 根帐户的密码。 按ENTER来接受这个建议。 选择并确认一个管理密码。

然后,脚本将继续提供额外的建议,这将有助于逆转默认 MySQL 安装中的某些不安全条件。

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

1sudo service mysql-server restart

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

配置 Nginx

我们的下一个任务是设置 Nginx. 要开始,我们需要启动 Web 服务器:

1sudo service nginx start

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

1cd /usr/local/etc/nginx

在这里,我们需要打开具有sudo特权的主要 Nginx 配置文件:

1sudo vi nginx.conf

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

要开始,删除评论并修改文件顶部的用户指令,我们需要Web服务器作为www用户,因为这是我们的PHP-FPM实例正在寻找的:

1user www;

我们还应该将worker_processes设置为您的系统所拥有的CPU或核心数量(要找出您的服务器有多少CPU,请从命令行键入sysctl hw.ncpu):

1worker_processes 2;

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

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

http块中,我们还会设置一个访问日志,该日志将位于/var/log/nginx/access.log:

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

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

1server {
2    listen 80;
3    server_name example.com www.example.com;
4
5    . . .

我们的文件根将是/usr/local/www/nginx,我们的索引指令应该试图在index.htmlindex.htm文件上回落之前服务index.php文件。

由于我们在服务器背景下定义了这些指令,我们不需要它们在位置/块中。

 1server {
 2
 3    . . .
 4
 5    root /usr/local/www/nginx;
 6    index index.php index.html index.htm;
 7
 8    location / {
 9        try_files $uri $uri/ =404;
10    }
11
12    . . .

最后,我们需要配置一个将处理PHP文件的位置块,这个块将匹配任何以.php结束的请求,它只会处理文件本身,如果无法找到文件,就会出现404错误。

我们将使用我们之前在php-fpm.conf文件中配置的接口。我们还将配置一些其他FastCGI代理选项,部分通过从fastcgi_params文件中读取参数。

 1server {
 2
 3    . . .
 4
 5    location ~ \.php$ {
 6        try_files $uri =404;
 7        fastcgi_split_path_info ^(.+\.php)(/.+)$;
 8        fastcgi_pass unix:/var/run/php-fpm.sock;
 9        fastcgi_index index.php;
10        fastcgi_param SCRIPT_FILENAME $request_filename;
11        include fastcgi_params;
12    }

总的来说,随着评论被删除,文件应该看起来像这样:

 1user www;
 2worker_processes 2;
 3error_log /var/log/nginx/error.log info;
 4
 5events {
 6    worker_connections 1024;
 7}
 8
 9http {
10    include mime.types;
11    default_type application/octet-stream;
12
13    access_log /var/log/nginx/access.log;
14
15    sendfile on;
16    keepalive_timeout 65;
17
18    server {
19        listen 80;
20        server_name example.com www.example.com;
21        root /usr/local/www/nginx;
22        index index.php index.html index.htm;
23
24        location / {
25            try_files $uri $uri/ =404;
26        }
27
28        error_page 500 502 503 504  /50x.html;
29        location = /50x.html {
30            root /usr/local/www/nginx-dist;
31        }
32
33        location ~ \.php$ {
34                try_files $uri =404;
35                fastcgi_split_path_info ^(.+\.php)(/.+)$;
36                fastcgi_pass unix:/var/run/php-fpm.sock;
37                fastcgi_index index.php;
38                fastcgi_param SCRIPT_FILENAME $request_filename;
39                include fastcgi_params;
40        }
41    }
42}

保存并关闭文件,当你完成。

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

1sudo mkdir -p /var/log/nginx

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

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

现在,我们已经将我们的根配置为 /usr/local/www/nginx,但目前,这是一个象征性的链接到 /usr/local/www/nginx-dist 目录,未来可能会通过包操作更新。

我们应该摧毁链接并再次创建无链接目录:

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

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

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

当我们在这里时,我们还应该创建一个临时的info.php文件,我们可以使用它来测试 Nginx 向 PHP-FPM 传递请求的能力。

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

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

1<?php phpinfo(); ?>

保存并关闭文件,当你完成。

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

1sudo nginx -t

如果您的配置文件没有可检测的语法错误,您应该看到这样的东西:

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

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

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

1sudo service nginx restart

测试结果

我们的网页堆栈现在已经完成了,我们所剩下的只是测试它。

在您的 Web 浏览器中,请先到您的基本域名或服务器的 IP 地址:

1http://example.com

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

FreeBSD Nginx default index

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

在您的浏览器中,访问您的域名或服务器 IP 地址,然后是 /info.php:

1http://example.com/info.php

你应该看到一个生成的PHP信息页面,看起来像这样:

FreeBSD php info page

如果您可以看到此页面,您已在您的 FreeBSD 服务器上成功配置了 FEMP 堆栈。

在测试您的配置后,从文档根中删除info.php文件是很好的想法,因为它可以给出有关您的安装的一些敏感信息:

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

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

结论

您现在应该有一个由 Nginx 驱动的完全功能的 Web 服务器,可以处理动态 PHP 内容并使用 MySQL 存储数据。

Published At
Categories with 技术
comments powered by Disqus