如何在FreeBSD11.2上安装Nginx

来自菜鸟教程
跳转至:导航、​搜索

介绍

Nginx 是世界上最流行的 Web 服务器之一,以经常用作负载均衡器和反向代理而闻名。 它比 Apache 对资源更友好,并且互联网上许多最大和流量最高的网站都依赖 Nginx 来提供其内容。

在本指南中,我们将演示如何在 FreeBSD 11.2 服务器上安装 Nginx。

先决条件

在开始本指南之前,您需要访问运行 FreeBSD 的服务器。 本指南是专门针对运行 FreeBSD 11.2 的服务器编写的,尽管它也应该适用于受支持的旧操作系统版本。

如果您是使用 FreeBSD 的新手,您可能会发现按照 这些说明 自定义此服务器很有帮助。

此外,如果您计划为此服务器设置域名,您将需要以下内容:

  • 您拥有和控制的注册域名。 如果您还没有注册域名,您可以在众多域名注册商之一注册一个(例如 Namecheap、GoDaddy 等)。
  • DNS A 记录 将您的域指向您服务器的公共 IP 地址。 您可以关注 this hostname tutorial 了解如何添加它们的详细信息。

第 1 步 — 安装 Nginx

首先,我们将使用 FreeBSD 内置的二进制包管理工具 pkg 安装 Nginx。 以下命令将更新可用包的本地副本,然后安装 nginx 包:

sudo pkg install nginx

如果这是您第一次运行 pkg,它将提示您确认您允许它自行引导。 为此,请按 y,然后按 ENTER。 然后,当出现提示时,通过按 y 然后再次按 ENTER 确认您批准安装 nginx 包。

如果您使用 cshtcsh shell,请确保运行 rehash 命令。 这使 shell 知道您安装的新应用程序:

rehash

注意:如果不确定当前使用的是哪个shell,可以使用以下命令进行检查:

echo $SHELL

输出将显示当前使用的 shell 程序的文件路径:

Output/bin/tcsh

Nginx 现在已安装在您的服务器上,但尚未运行。 在下一步中,我们将启用 Nginx 在每次服务器启动时开始运行并为此会话启动它,并通过使用 IPFW 设置防火墙来完成保护服务器的过程。

第 2 步 — 启用 Nginx 服务并使用 IPFW 设置防火墙

为了让 FreeBSD 将 Nginx 作为常规服务启动,您必须告诉 FreeBSD 您要启用它。 这将允许您像任何其他服务一样管理它,而不是作为一个独立的应用程序,并且还将配置 FreeBSD 以在启动时自动启动它。

为此,您首先需要知道要为 nginx 服务设置的正确 rc 参数。 rc 是一个 FreeBSD 实用程序,用于控制系统的自动启动过程。 系统上每个可用服务的脚本都位于 /usr/local/etc/rc.d 目录中。 这些定义了用于使用 rcvar 变量启用每个服务的参数。 我们可以通过键入以下内容来查看每个服务的 rcvar 设置为:

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

安装后,此命令将输出类似于以下内容的列表:

Output/usr/local/etc/rc.d/cloudconfig:rcvar="cloudinit_enable"
/usr/local/etc/rc.d/cloudfinal:rcvar="cloudinit_enable"
/usr/local/etc/rc.d/cloudinit:rcvar="cloudinit_enable"
/usr/local/etc/rc.d/cloudinitlocal:rcvar="cloudinit_enable"
/usr/local/etc/rc.d/nginx:rcvar=nginx_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

您需要为 nginx 服务设置的参数在此输出中突出显示。 脚本本身的名称——冒号前路径的最后一个组成部分——也有助于了解,因为这是 FreeBSD 用来指代服务的名称。

要启用 nginx 服务,您必须将其 rcvar 添加到 rc.conf 文件中,该文件包含启动脚本引用的全局系统配置信息。 使用您喜欢的编辑器以 sudo 权限打开 /etc/rc.conf 文件。 在这里,我们将使用 ee

sudo ee /etc/rc.conf

在文件的顶部,已经有几个 rcvar 参数。 在这些下方添加 nginx_enable rcvar 参数并将其设置为 "YES"

/etc/rc.conf

. . .
sshd_enable="YES"
nginx_enable="YES"

. . .

虽然仍在 rc.conf 文件中,但我们将添加更多指令来启用和配置 IPFW 防火墙。 IPFW 是为 FreeBSD 编写的状态防火墙。 它提供了一种强大的语法,允许您为大多数用例自定义安全规则。

在您刚刚添加的 nginx_enable 参数的正下方,添加以下突出显示的行:

/etc/rc.conf

. . .
nginx_enable="YES"
firewall_enable="YES"
firewall_type="workstation"
firewall_myservices="22/tcp 80/tcp"
firewall_allowservices="any"

以下是每个指令及其设置的作用:

  • firewall_enable="YES" - 将此指令设置为 "YES" 使防火墙能够在服务器启动时启动。
  • firewall_type="workstation" — FreeBSD 提供了几种默认类型的防火墙,每一种都有略微不同的配置。 通过声明 workstation 类型,防火墙将仅使用状态规则保护此服务器。
  • firewall_myservices="22/tcp 80/tcp"firewall_myservices 指令是您可以列出要允许通过防火墙的 TCP 端口的位置。 在此示例中,我们指定端口 2280 分别允许 SSH 和 HTTP 访问服务器。
  • firewall_allowservices="any" — 这允许来自任何 IP 地址的机器通过 firewall_myservices 指令中指定的端口进行通信。

添加这些行后,按 CTRL + C 保存文件并关闭编辑器,键入 exit,然后按 ENTER

然后,启动ipfw防火墙服务。 因为这是您第一次在此服务器上启动防火墙,所以这样做可能会导致您的服务器停止,使其无法通过 SSH 访问。 以下 nohup 命令(代表“无挂断”)将启动防火墙,同时防止停止,并将标准输出和错误重定向到临时日志文件:

sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

但是,如果您使用 cshtcsh shell,此重定向将导致 Ambiguous output redirect. 出现在您的输出中。 如果您使用这些 shell 中的任何一个,请运行以下命令来启动 ipfw

sudo nohup service ipfw start >&/tmp/ipfw.log

注意:以后可以像管理其他服务一样管理ipfw防火墙。 例如,要停止、启动然后重新启动服务,您将运行以下命令:

sudo service ipfw stop
sudo service ipfw start
sudo service ipfw restart

接下来,启动nginx服务

sudo service nginx start

然后,为了测试 Nginx 是否能够正确地提供内容,请在首选 Web 浏览器的 URL 栏中输入服务器的公共 IP 地址:

http://your_server_ip

注意: 如果您不确定服务器的公共 IP 地址,您可以运行以下命令,该命令将打印您服务器的 IP 地址,如从 Internet 上的其他位置所见:

curl -4 icanhazip.com

如果一切正常,您将看到默认的 Nginx 登录页面:

这表明 Nginx 已正确安装并运行,并且已按预期通过防火墙。 但是,仍然需要进行一些配置更改,以便它使用非默认设置或使用域名提供内容。

第 3 步 — 设置服务器块

使用 Nginx Web 服务器时,服务器块(类似于 Apache 中的虚拟主机)可用于封装配置细节并从单个服务器托管多个域。 我们将设置一个名为 example.com 的域,但您应该将 替换为您自己的域名 。 要了解有关使用 DigitalOcean 设置域名的更多信息,请参阅我们的 DigitalOcean DNS 简介

FreeBSD 11.2 上的 Nginx 默认启用一个服务器块,该块被配置为从 /usr/local/www/nginx 的目录中提供文档。 虽然这适用于单个站点,但如果您托管多个站点,它可能会变得笨拙。 让我们在 /usr/local/www 中为我们的 example.com 站点创建一个目录结构,而不是修改 /usr/local/www/nginx

如下为 example.com 创建目录,使用 -p 标志创建任何必要的父目录:

sudo mkdir -p /usr/local/www/example.com/html

接下来,将目录的所有权分配给 www 用户,默认的 Nginx 运行时用户配置文件:

sudo chown -R www:www /usr/local/www/example.com

如果您没有修改 umask 值,您的 Web 根目录的权限应该是正确的,但您可以通过键入以下内容来确保:

sudo chmod -R 755 /usr/local/www/example.com

接下来,使用 ee 创建示例 index.html 页面:

sudo ee /usr/local/www/example.com/html/index.html

在里面,添加以下示例 HTML:

/usr/local/www/example.com/html/index.html

<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success!  The example.com server block is working!</h1>
    </body>
</html>

完成后保存并关闭文件。

为了让 Nginx 提供此内容,有必要使用正确的指令创建一个服务器块。 打开主要的 Nginx 配置文件。 默认情况下,它保存在 /usr/local/etc/nginx/ 目录中:

sudo ee /usr/local/etc/nginx/nginx.conf

注意:一般情况下,您要避免编辑默认的nginx.conf文件。 但是,在同一目录中,有一个名为 nginx.conf-dist 的文件,它与默认的 nginx.conf 文件相同。 如果您发现需要恢复这些配置更改,您可以使用以下命令复制此文件:

sudo cp /usr/local/etc/nginx/nginx.conf-dist /usr/local/etc/nginx/nginx.conf

首次打开文件时,您会在最顶部看到以下内容:

/usr/local/etc/nginx/nginx.conf

#user  nobody;
worker_processes  1;

. . .

通过删除井号 (#) 取消注释 user 指令,然后将用户从 nobody 更改为 www。 然后更新 worker_processes 指令,它允许您选择 Nginx 将使用多少个工作进程。 在此处输入的最佳值并不总是显而易见或容易找到。 将其设置为 auto 告诉 Nginx 将其设置为每个 CPU 核心一个工作人员,这在大多数情况下就足够了:

/usr/local/etc/nginx/nginx.conf

user  www;
worker_processes  auto;
. . .

然后向下滚动到 server 块。 删除所有评论后,它将如下所示:

/usr/local/etc/nginx/nginx.conf

. . .
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }

删除整个服务器块,包括所有注释掉的行,并将其替换为以下内容:

/usr/local/etc/nginx/nginx.conf

. . .
    server {
        access_log /var/log/nginx/example.com.access.log;
        error_log /var/log/nginx/example.com.error.log;
        listen       80;
        server_name  example.com www.example.com;

        location / {
            root   /usr/local/www/example.com/html;
            index  index.html index.htm;
        }
    }
. . .

这是此服务器块中的指令的作用:

  • access_log:该指令定义服务器访问日志的位置。
  • error_log:这定义了 Nginx 将写入其错误日志的文件。
  • listenlisten 指令声明 Nginx 应该监听的端口。 在这种情况下,我们将其设置为端口 80,以便它可以侦听 HTTP 流量。
  • server_name:在这里,将 Nginx 指向您的域名和您拥有的任何别名。 如果您没有域名,请将 Nginx 指向您服务器的公共 IP 地址。
  • root:这定义了您在此步骤之前创建的网站文档根目录。
  • index:该指令定义将用作索引的文件,以及检查它们的顺序。

总之,删除注释后,文件将如下所示:

/usr/local/letc/nginx/nginx.conf

user  www;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        access_log /var/log/nginx/example.com.access.log;
        error_log /var/log/nginx/example.com.error.log;
        listen       80;
        server_name  example.com www.example.com;

        location / {
            root   /usr/local/www/example.com;
            index  index.html index.htm;
        }

    }

}

完成后保存并关闭文件。 然后,通过键入以下内容来测试配置文件的语法错误:

sudo nginx -t

如果您的配置文件没有可检测到的语法错误,您将看到以下输出:

Outputnginx: 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 reload

Nginx 现在应该提供您在 index.html 文件中设置的内容。 通过导航到 http://example.com 进行测试,您应该会看到如下内容:

作为最后一步,我们将介绍一些允许您管理 Nginx 服务的命令。

第 4 步 - 管理 Nginx 进程

现在您已经启动并运行了 Web 服务器,让我们回顾一些基本的管理命令。

要停止您的 Web 服务器,请键入:

sudo service nginx stop

要在 Web 服务器停止时启动它,请键入:

sudo service nginx start

要停止然后再次启动服务,请键入:

sudo service nginx restart

如果您只是进行配置更改,则可以重新加载 Nginx 而不会断开任何连接。 为此,请键入:

sudo service nginx reload

最后,回想一下在第 2 步中我们如何通过将 nginx_enable="YES" 指令添加到 rc.conf 文件来启用 nginx 服务。 如果您想禁用 nginx 服务以防止它在服务器启动时启动,您需要重新打开该文件并删除该行。

结论

您现在已经在您的机器上安装了一个功能齐全的 Nginx Web 服务器。 从这里,您可以通过启用 HTTPS 来加密服务器的网络流量。 要了解如何执行此操作,请参阅 How To Secure Nginx with Let's Encrypt on FreeBSD。 您还可以 安装和配置 MySQL 和 PHP,它们与 Nginx 一起将为您提供完整的 FEMP 堆栈。