介绍
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.html
或index.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 文件的内容,它会看起来像这样:
这表明 Nginx 正在运行,并且能够提供简单的 HTML 页面。
在您的浏览器中,访问您的域名或服务器 IP 地址,然后是 /info.php
:
1http://example.com/info.php
你应该看到一个生成的PHP信息页面,看起来像这样:
如果您可以看到此页面,您已在您的 FreeBSD 服务器上成功配置了 FEMP 堆栈。
在测试您的配置后,从文档根中删除info.php
文件是很好的想法,因为它可以给出有关您的安装的一些敏感信息:
1sudo rm /usr/local/www/nginx/info.php
您可以随时轻松地重新创建此文件。
结论
您现在应该有一个由 Nginx 驱动的完全功能的 Web 服务器,可以处理动态 PHP 内容并使用 MySQL 存储数据。