如何在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
块中配置 root
和 index
指令。 我们的文档根目录是 /usr/local/www/nginx
并且我们的 index 指令应该在返回 index.html
或 index.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 应用程序的基础。