介绍
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
包。
如果您使用 csh
或 tcsh
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 端口的位置。 在此示例中,我们指定端口22
和80
分别允许 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
但是,如果您使用 csh
或 tcsh
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 将写入其错误日志的文件。listen
:listen
指令声明 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 堆栈。