如何在虚拟专用服务器上配置 Nginx Web 服务器

2023-11-11

Status:已弃用

本文介绍不再受支持的 Ubuntu 版本。如果您当前运行的服务器运行 Ubuntu 12.04,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

  • 升级到Ubuntu 14.04.
  • 从 Ubuntu 14.04 升级到 Ubuntu 16.04
  • 将服务器数据迁移到支持的版本

Reason: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL)并且不再接收安全补丁或更新。本指南不再维护。

请参阅:
本指南可能仍然可以作为参考,但可能不适用于其他 Ubuntu 版本。如果有的话,我们强烈建议您使用针对您所使用的 Ubuntu 版本编写的指南。您可以使用页面顶部的搜索功能来查找更新的版本。

什么是 Nginx?

Nginx 是一个 Web 服务器和反向代理服务器。它已被广泛采用,并正在取代许多其他常见选项。

虽然 Nginx 是一个功能强大的工具,但它的配置对于那些来自其他服务器的人或一般来说不熟悉 Web 服务器的人来说可能会令人生畏。在本指南中,我们将探索主要的 Nginx 配置文件并揭开一些语法和选项的神秘面纱。

我们将使用 Ubuntu 12.04 安装,但大多数发行版都将配置类似的文件位置。

Nginx 配置目录层次结构

Nginx 将其配置文件存储在“/etc/nginx”目录中。

在这个目录中,您会发现一些目录和各种模块化配置文件:


cd /etc/nginx
ls -F  

conf.d/         koi-win           naxsi.rules   scgi_params       uwsgi_params
fastcgi_params  mime.types        nginx.conf    sites-available/  win-utf
koi-utf         naxsi_core.rules  proxy_params  sites-enabled/  

如果您来自 Apache,那么“sites-available”和“sites-enabled”目录将会很熟悉。

这些目录用于定义您网站的配置。文件通常在“sites-available”目录中创建,然后在准备上线时符号链接到“sites-enabled”目录。

“conf.d”目录也可用于站点配置。当 Nginx 启动时,此目录中以“.conf”结尾的每个文件都会被读入配置中,因此请确保每个文件都定义了有效的 Nginx 配置语法。

“/etc/nginx”目录中的大多数其他文件包含特定进程或可选组件的配置详细信息。

然而,“nginx.conf”文件是主要的配置文件。我们将更深入地探讨该文件。

探索 nginx.conf 文件

nginx.conf 文件是 Nginx 的主要控制点。该文件读取所有其他适当的配置文件,并在服务器启动时将它们组合成一个整体配置文件。

打开该文件以便我们讨论一般格式:


sudo nano /etc/nginx/nginx.conf  

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
. . .  

前几行用于定义有关 Nginx 如何运行的一些一般事实。

例如,服务器通过“user www-data”行决定以哪个用户身份运行。这是 Ubuntu 的典型 Web 服务器用户。

“pid”指令指定进程 pid 的存储位置以供内部参考。 “worker_processes”定义 Nginx 将使用多少个并发进程。

配置文件的这一部分还可以包含使用“error_log”指令的错误日志位置之类的内容。

我们文件的下一部分是事件部分。这是一个控制 Nginx 如何处理连接的特殊位置。在我们的示例中,我们不需要调整本节中的任何内容,因此我们将继续。

以下部分是 http 块。这导致了关于 Nginx 配置文件如何格式化的更复杂的讨论。

Nginx 配置文件布局

Nginx 配置文件是按“块”进行管理的。

我们看到的第一个块是事件块。下一个是 http 块,也是配置文件中主层次结构的开始。

http 块中的配置详细信息是分层的,封闭的块继承了它们所在块的属性。Nginx 的大部分常规配置都发生在 http 块中,该块包含服务器块,而服务器块又包含位置块。

重要的是,您应该始终将配置详细信息放入它们适用的最高容器中。这意味着,如果您希望参数 X 应用于每个服务器块,那么将其放置在 http 块中将导致它传播到每个服务器配置。

如果您查看我们的文件,您会注意到它有许多选项,这些选项决定了软件作为一个整体如何运行。这是此类指令的适当位置。

例如,我们使用以下几行设置文件压缩选项:


gzip on;
gzip_disable "msie6";  

这告诉 Nginx 启用 gzip 来压缩发送到客户端的数据,但当客户端是 Internet Explorer 版本 6 时禁用 gzip 压缩,因为该浏览器不支持 gzip 压缩。

如果您的选项对于某些服务器块应具有不同的值,则可以在更高级别指定它们,然后在服务器块内覆盖它们。 Nginx 将采用适用于设置的最低级别规范。

这种在尽可能最高级别应用设置的方式使您不必管理多个相同的声明。它还具有提供默认值的优点,如果您忘记在“服务器”块级别或以下级别声明某些内容,可以使用默认值。

在“nginx.conf”文件中,我们可以看到“http”块的末尾有:


include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;  

这告诉我们,定义特定站点和 url 匹配位置的服务器和位置块将发生在该文件之外。

这使我们能够维护模块化配置安排,当我们想要为新站点提供服务时,我们可以创建新文件。它允许我们将相关内容分组在一起,同时隐藏在大多数情况下不会改变的细节。

退出“nginx.conf”文件,以便我们可以在下一节中检查单个站点配置。

探索默认服务器块

Nginx 使用服务器块来完成 Apache 虚拟主机中的功能。将服务器块视为服务器可以托管的各个网站的规范。

我们将查看位于“sites-available”目录中包含的默认服务器块配置。该文件包含提供默认网页所需的所有必要信息。


cd sites-available
sudo nano default  

server {
	root /usr/share/nginx/www;
	index index.html index.htm;

	server_name localhost;

	location / {
		try_files $uri $uri/ /index.html;
	}

	location /doc/ {
		alias /usr/share/doc/;
		autoindex on;
		allow 127.0.0.1;
		deny all;
	}
}  

默认文件有很好的注释,但我删除了此处的注释以节省空间并演示站点的定义是多么简单。

我们有一个服务器块,其中包含左括号和相关右括号之间的所有内容:


server {
	. . .
}  

通过使用“include”指令,将该块放置在“nginx.conf”文件中靠近 http 块末尾的位置,正如我们在上一节中讨论的那样。

“root”指令定义网站内容所在的目录。这是 Nginx 开始查找浏览器请求的文件的位置。默认网站在“/usr/share/nginx/www”中搜索其内容。

请注意每行如何以分号 (;) 结尾。这就是 Nginx 知道一个指令已完成并且下一个指令将开始的方式。不要忘记分号,否则 Nginx 会将后面的行视为指令的附加参数。它将执行此操作,直到到达分号为止。

下一行涉及“index”指令。

这将配置为域提供的默认页面。如果没有请求页面,服务器块将搜索名为“index.html”的文件并返回它。如果找不到该文件,它将尝试提供名为“index.htm”的文件。

使用 server_name 指令

“server_name”指令包含将从该服务器块提供服务的域名列表。您可以包含任意多个名称,并用空格分隔。

您还可以在服务器名称的开头或结尾使用星号字符作为匹配所有内容的通配符。例如,“*.example.com”将匹配“forum.example.com”和“animals.example.com”的请求。

如果请求的 url 匹配多个“server_name”指令,它将选择第一个完全匹配的那个。如果没有完全匹配,它将选择以星号开头的最长通配符名称。

如果仍未找到匹配项,它将查找以星号结尾的最长匹配通配符名称。如果没有找到这些,它将返回第一个匹配的正则表达式匹配项。

使用正则表达式匹配的服务器名称以波形符 (~) 字符开头。正则表达式非常强大,但超出了本文的范围。

使用位置块

配置文件的下一部分打开一个位置块。位置块用于指定如何在服务器内处理某些资源请求。

“location /”行指定括号内的指令将应用于客户端请求的与其他位置块不匹配的所有资源。

位置块可以包含 uri 路径,例如在文件中进一步指定的“/doc/”路径,可以在位置和 uri 之间使用等号 (=) 来指定精确匹配,或者使用波浪号 (~) 字符来指示常规表达式匹配。

普通波浪号表示区分大小写的匹配,波浪号后跟星号 (~*) 表示不区分大小写匹配,波浪号前面带有克拉 (^~) 告诉 Nginx 如果 uri 与此位置匹配,则不执行正则表达式搜索。

位置匹配类似于 server_name 匹配,因为 Nginx 有一个明确定义的过程来决定使用哪个块。

如果查询与带有等号的位置匹配,则使用该位置并停止搜索。如果没有,则搜索常规文字 uri 位置。如果使用了克拉波浪号 (^~) 并且 uri 位置匹配,则将选择此块。

如果未使用该选项,它将选择最具体的匹配并保留该值。然后它将执行正则表达式匹配以查看是否可以匹配这些模式中的任何一个。如果找到,则使用正则表达式块。如果没有,则使用之前匹配的 uri 位置。

总而言之,Nginx 更喜欢精确匹配,然后是正则表达式匹配,然后是文字 URI 匹配,但文字 URI 匹配可以通过在它们前面加上“^~”来显式地变得更加重要。

此列表定义了这些首选项:

<ol>
	<li>Equal sign matches</li>
	<li>Literal URI matches with "^~"</li>
	<li>Most specific regular expression match</li>
	<li>Most specific literal URI match</li>
</ol>

尽管这可能看起来令人困惑,但这些定义的规则是必要的,以便 Nginx 可以毫不含糊地做出决定。

如何使用 try_files

try_files 指令是一个非常有用的工具,用于定义应对资源请求进行的一系列尝试。

这意味着您可以声明您希望 Nginx 如何尝试通过一系列替代选项来服务请求。

默认配置文件中的示例是:


try_files $uri $uri/ /index.html;  

这意味着当发出由该位置块提供服务的请求时,Nginx 将首先尝试将文字 uri 作为文件提供。这是使用“$uri”变量声明的,该变量将保存所请求的资源。

如果没有与 $uri 的值匹配的文件,那么它将尝试使用 uri 作为目录。它将尝试为 uri 目录提供默认文件(我们的文件是 index.html,如果您还记得的话)。

如果没有与 $uri 的值匹配的目录,则它使用默认文件,即服务器块根目录中的“index.html”文件。每个“try_files”指令都使用最后一个参数作为后备默认值,因此它必须是已知的真实文件。

如果您不希望在前面的参数不匹配的情况下返回文件,则另一个选项是返回错误页面。这是使用等号和错误代码来完成的。

例如,如果我们希望“location /”块在无法找到资源时返回 404 错误,而不是提供默认的“index.html”页面,我们可以用“=404”替换最后一个文件:


try_files $uri $uri/ =404;  

如果用户请求不存在的资源,这将向用户抛出适当的错误页面。

其他选项

配置文件的其余部分包含一些其他有趣的指令。

“alias”指令告诉 Nginx 该位置块的页面应该在指定的目录之外提供。这些可以在根目录之外。

在我们的示例中,“/doc/”中请求的资源将从“/usr/share/doc/”中提供。

“autoindex on”指令允许 Nginx 生成指定位置的目录列表。当请求目录时,这将被返回。

“允许”和“拒绝”行设置目录的访问控制。当用户尝试从本地服务器访问该位置时,我们文件中的行允许读取内容。

结论

Nginx 对其某些功能使用不同的术语,但它是一个功能非常强大的服务器,具有许多配置选项。

学习如何正确配置 Nginx Web 服务器将使您能够充分利用一款功能强大且占用资源极少的软件。这使其成为任何规模网站的理想选择。

贾斯汀·埃林伍德
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在虚拟专用服务器上配置 Nginx Web 服务器 的相关文章

随机推荐

  • 如何在 CentOS 8 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • 如何在树莓派上安装Java

    Java 是最流行的编程语言之一 用于构建不同类型的应用程序和系统 Java 有两种不同的实现 Oracle Java 和 OpenJDK OpenJDK 是 Java 平台的开源实现 Oracle Java 有一些额外的商业功能和lice
  • 如何在 CentOS 7 上安装 Tomcat 8.5

    本教程向您展示如何在 CentOS 7 上安装 Tomcat 8 5 Tomcat 是 Java Servlet JavaServer Pages Java 表达式语言和 Java WebSocket 技术的开源实现 先决条件 在开始本教程
  • Python 中的 numpy.square()

    Python numpy square 函数返回一个新数组 其元素值作为源数组元素的平方 源数组保持不变 Python numpy square 示例 它是一个快速求矩阵元素平方的实用函数 让我们看一下带有整数 浮点和复数类型数组元素的 n
  • 如何在 Ubuntu 14.04 上安装和保护 phpMyAdmin

    介绍 虽然许多用户需要 MySQL 等数据库管理系统的功能 但他们可能不习惯仅通过 MySQL 提示符与系统交互 php我的管理员创建的目的是让用户可以通过 Web 界面与 MySQL 进行交互 在本指南中 我们将讨论如何安装和保护 php
  • 如何在 CentOS 7 上安装 Elasticsearch、Logstash 和 Kibana(ELK Stack)

    介绍 在本教程中 我们将介绍在 CentOS 7 即 Elasticsearch 2 2 x Logstash 2 2 x 和 Kibana 4 4 x 上安装 Elasticsearch ELK Stack 我们还将向您展示如何使用 Fi
  • 如何在 Ubuntu 上的 WordPress 中配置安全更新和安装

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • Spring JDBC 示例

    Spring JDBC 是本教程的主题 数据库是大多数企业应用程序不可或缺的一部分 因此 当涉及到 Java EE 框架时 必须与JDBC非常重要 春季 JDBC Spring Framework provides excellent in
  • 带有 COUNT() 函数的 SQL SELECT 语句

    嘿伙计 在这篇文章中 我们将重点关注SQL SELECT 语句以及 COUNT 函数 什么是 SQL SELECT 语句 SQL SELECT 语句帮助我们选择并显示数据库特定表中的数据值 Syntax SELECT columns FRO
  • Python 有序字典

    Python OrderedDict 是一个dict维护项目插入顺序的子类 当我们迭代 OrderedDict 时 项目将按照插入的顺序返回 常规字典不跟踪插入顺序 因此 当对其进行迭代时 项目会以任意顺序返回 当我们想要确保项目按照插入顺
  • 代理设计模式

    代理设计模式是结构设计模式之一 在我看来也是最容易理解的模式之一 代理设计模式 Proxy design pattern intent according to GoF is Provide a surrogate or placehold
  • 如何在 Ubuntu 16.04 上使用 RVM 安装 Ruby on Rails

    介绍 Ruby on Rails 是最受希望创建网站和 Web 应用程序的开发人员欢迎的应用程序堆栈之一 Ruby 编程语言与 Rails 开发框架相结合 使应用程序开发变得简单 您可以使用命令行工具轻松安装 Ruby 和 RailsRVM
  • C/C++中二叉树的高度

    二叉树的高度定义为任何叶节点距根节点的最大深度 即从根节点到任意叶子节点的最长路径的长度 让我们考虑下面的二叉树 Binary Tree Ht 由于最大深度对应的叶子节点为40 and 50 为了求出高度 我们只需求出从根节点到这两个节点之
  • 如何在 Ubuntu 22.04 上安装和配置 Ansible

    介绍 配置管理系统旨在简化管理员和运营团队控制大量服务器的过程 它们允许您从一个中心位置以自动化方式控制许多不同的系统 虽然有许多流行的配置管理工具可用于 Linux 系统 例如Chef and Puppet 这些通常比许多人想要或需要的更
  • 了解 R 中的plot() 函数 - 图形绘制基础知识

    在本教程中 让我们首先了解 R 中使用plot 函数的基础知识 R 语言以其精美的图形而闻名 它具有丰富的函数来构建和格式化任何类型的图形以及plot 函数族之一可以帮助我们构建这些函数 R 中的plot 函数不是单个定义的函数 而是一系列
  • 如何在 Ubuntu 14.04 上安装 Tinc 并设置基本 VPN

    介绍 在本教程中 我们将介绍如何使用 Tinc 一个开源虚拟专用网络 VPN 守护程序 来创建一个安全的 VPN 您的服务器可以在该 VPN 上进行通信 就像在本地网络上一样 我们还将演示如何使用 Tinc 建立通往专用网络的安全隧道 我们
  • 如何使用 Python WebSSH 从浏览器连接到终端

    介绍 通常 您使用终端中的命令行应用程序或包含 SSH 客户端的终端仿真器软件连接到 SSH 服务器 一些工具 例如 Python 的WebSSH 可以通过 SSH 连接并直接在 Web 浏览器中运行终端 这在许多情况下都很有用 当以具有视
  • 在 Ubuntu 18.04 上使用 Nginx 安装 WordPress

    WordPress是最受欢迎的开源内容管理系统 CMS 之一 与 Drupal 或 Joomla 等其他 CMS 相比 拥有高达 60 的市场份额 WordPress 可用于开发任何类型的网站 无论是博客 小型企业还是大型企业 凭借其免费和
  • Java中的模板方法设计模式

    模板方法是行为设计模式 模板方法设计模式用于创建方法存根并将某些实现步骤推迟到子类 模板方法设计模式 模板方法定义了执行算法的步骤 并且它可以提供可能对所有或某些子类通用的默认实现 让我们通过一个例子来理解这个模式 假设我们想提供一种建造房
  • 如何在虚拟专用服务器上配置 Nginx Web 服务器

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级