介绍
Nginx,MySQL和PHP可以很容易地组合在一起,作为在网络上提供动态内容的强大解决方案。 这三件软件可以安装,并在FreeBSD机器上配置创造了被称为一个FEMP 。
在本指南中,我们将演示如何在FreeBSD 10.1服务器上安装FEMP。 我们将使用软件包安装软件,以便更快启动和运行。 这些包提供合理的默认值,适用于大多数服务器。
安装组件
首先,我们将使用FreeBSD包系统安装我们需要的所有软件。 “install”命令将更新可用软件包的本地副本,然后安装我们请求的软件包:
sudo pkg install nginx mysql56-server php56 php56-mysql
这将下载并安装Nginx Web服务器来提供我们的内容,MySQL数据库服务器用于存储信息,以及PHP处理语言来处理动态内容。
一旦安装完成后,请务必运行rehash
,如果您运行的是默认的命令tcsh
外壳。 这使得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用于服务的实际名称。
要启用这些服务,我们将编辑/etc/rc.conf
使用sudo权限的文件:
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.ini
文件PHP读取。
在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根帐户的当前密码开始。 由于我们还没有为此用户设置密码,我们可以按“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
现在,我们可以开始通过转到Nginx的配置nginx
目录/usr/local/etc
的目录:
cd /usr/local/etc/nginx
在这里,我们需要打开与主Nginx的配置文件sudo
权限:
sudo vi nginx.conf
在内部,我们可以开始进行更改,以使我们的Nginx实例可以与我们的其他组件一起工作。
要启动,取消和修改user
在文件顶部的指令。 我们需要Web服务器作为操作www
用户,因为这正是我们的PHP-FPM实例寻找:
user www;
我们还应该设置worker_processes
到CPU或该系统具有核心的数量。 (要了解你的服务器有多少的CPU了,类型sysctl hw.ncpu
命令行):
worker_processes 2;
接下来,我们将通过设置错误的详细程度和位置error_log
指令。 我们将记录在一个位置/var/log/nginx/error.log
在info
日志级别:
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;
. . .
配置root
和index
的主要指示server
模块。 我们的文档根目录会/usr/local/www/nginx
和我们的索引指令应尝试以服务index.php
回落之前文件index.html
或index.htm
文件。
由于我们所定义的范围内,这些指令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
由于我们仍然需要测试我们的网络服务器,我们可以把复制index.html
文件到我们的新网站根目录:
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
测试结果
我们的web现在完成了。 我们剩下要做的就是测试一下。
在您的网络浏览器中,首先转到您的基本域名或服务器的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驱动,可以处理动态PHP内容和使用MySQL存储数据。 此配置可用作各种其他配置和Web应用程序的基础。