如何在FreeBSD的安装10.1 Nginx的一个,MySQL和PHP(FEMP)

Nginx的,MySQL和PHP可以很容易地为在网络上提供动态内容的强大解决方案结合在一起。这三件软件可以安装,并在FreeBSD机器上配置创造了被称为一个FEMP。在本指南中,我们将...

介绍

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.loginfo日志级别:

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;

    . . .

配置rootindex的主要指示server模块。 我们的文档根目录会/usr/local/www/nginx和我们的索引指令应尝试以服务index.php回落之前文件index.htmlindex.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 ,我们复制文件。 它看起来像这样:

FreeBSD的Nginx默认索引

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

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

http://example.com/info.php

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

FreeBSD的php信息页面

如果您可以看到此页面,则说明您已成功在FreeBSD服务器上配置了一个FEMP。

测试你的配置后,这是一个好主意,除去info.php从你的文档根目录文件,因为它可以放弃有关安装的一些敏感信息:

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

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

结论

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