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

本文档涵盖的是不再受支持的 Ubuntu 版本。如果您目前正在运行 Ubuntu 12.04 服务器,我们强烈建议升级或迁移到受支持的 Ubuntu 版本:

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

原因: 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” 目录也可以用于站点配置。在此目录中以 “.conf” 结尾的每个文件在 Nginx 启动时都会被读入配置,因此请确保每个文件定义有效的 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” 指令指定错误日志位置等内容。

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

接下来的部分是 http 块。这导致了有关 Nginx 配置文件格式的更复杂的讨论。

Nginx 配置文件布局

Nginx 配置文件以 “块” 的形式进行管理。

我们看到的第一个块是 events 块。接下来是 http 块,这是配置文件中的主要层次结构的开始。

http 块中的配置细节是分层的,封闭块从其所在的块继承属性。Nginx 的大多数一般配置都在 http 块中进行,其中包含服务器块,服务器块又包含位置块。

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

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

例如,我们设置了文件压缩选项:

gzip on;
gzip_disable "msie6";

这告诉 Nginx 启用 gzip 以压缩发送到客户端的数据,但在客户端是 Internet Explorer 6 时禁用 gzip 压缩,因为该浏览器不理解 gzip 压缩。

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

在最可能的最高级别应用设置的风格可以避免您管理多个相同声明。它还具有提供默认值的优势,可以在忘记在 “server” 块级别或以下声明某些内容时使用。

在 “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 /” 行指定括号内的指令将适用于客户端请求的所有不匹配其他位置块的资源。

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

纯波浪号表示区分大小写的匹配,后面跟着星号(*)表示不区分大小写的匹配,以及以插入符(^)开头的波浪号告诉 Nginx 如果 uri 匹配此位置,则不执行正则表达式搜索。

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

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

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

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

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

  1. 等号匹配
  2. 具有 “^~” 的文字 URI 匹配
  3. 最具体的正则表达式匹配
  4. 最具体的文字 URI 匹配

尽管这可能看起来令人困惑,但这些定义的规则是必要的,以便 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 为指定位置生成目录列表。当请求目录时,将返回此列表。

“allow” 和 “deny” 行为目录设置访问控制。我们文件中的行允许在尝试从本地服务器访问位置时读取内容。

结论

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

学习如何正确配置 Nginx Web 服务器将使您能够充分利用一款既非常强大又资源消耗极低的软件。这使它成为任何规模网站的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/575548.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NLP step by step -- 了解Transformer

Transformer模型 Transformer相关历史 首先我们先看一下有关Transformer模型的发展历史,下面的图是基于Transformer架构的一些关键模型节点: 图片来源于Hugging Face 图片来源于Hugging Face Transformer 架构 于 2017 年 6 月推出。原本研究的重点是…

deepin 亮相 Intel 合作伙伴交流会,展示AI大模型应用最新成果

内容来源:deepin 社区 2024 年 4 月 18 日,备受业界瞩目的 Intel Channel Partner Networking Fair 在香港天际万豪酒店隆重举办。 在这场行业盛会上,deepin(深度)受邀参与了 Intel Demo Showcase 环节,向…

JDBC查询大数据时怎么防止内存溢出-流式查询

文章目录 1.前言2.流式查询介绍3.使用流式查询3.1不开启流式查询的内存占用情况3.2开启流式查询的内存占用情况 4.开启流式查询的注意点 1.前言 在使用 JDBC 查询大数据时,由于 JDBC 默认将整个结果集加载到内存中,当查询结果集过大时,很容易…

python与pycharm如何设置文件夹为源代码根目录

相信大家遇到过下面这种情况 当我们在当前项目下引入了其它项目的代码,这是其它项目的包的导入路径是不用于当前项目的,这样导致项目无法正常起来,但是我们又不可能一个个文件去处理,这时可以用下面的方式解决 pycharm直接设置 …

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错,是由于系统叫老yum源存在问题 处理方法 更换下述yum源,可以将其他repo源文件备份移动到其他目录,添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

非对称渐开线齿轮学习笔记分享

最近有小伙伴遇到了非对称渐开线齿轮的加工问题,花了些时间学习了解一下,下面是总结的学习笔记,有兴趣的朋友可以瞅瞅: 目录: 为什么要采用非对称? 非对称有什么优点? 非对称齿形如何加工? 非对称齿轮怎么测量? 非对称齿轮建模 为什么要采用非对称? 现在的传动要求…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

streamlit data_editor学习之 LLM理论内存占用量计算器

streamlit data_editor学习之 LLM理论内存占用量计算器 一.效果二.代码三.运行命令四.参考链接 根据用户设置的LLM参数,计算设备内存的占用量。以web的形式方便共享,可以插入多条记录,表格更新后,可以动态计算结果 一.效果 二.代码 import streamlit as st #1.31.1 import cv…

【八股】Spring Boot

SpringBoot是如何实现自动装配的? 首先,SpringBoot的核心注解SpringBootApplication里面包含了三个注解,SpringBootConfigurationEnableAutoConfigurationComponentScan,其中EnableAutoConfiguration是实现自动装配的注解&#x…

如何最大程度使用AWS?

随着云计算技术的不断发展,AWS已经成为众多企业的首选,为其提供了强大的基础设施和服务。那么如何最大程度地、灵活地利用AWS,成为许多企业专注的焦点。九河云作为AWS的合作伙伴,为读者们提供一些技巧和策略,帮助读者充…

UL认证防逆流多功能监测装置AGF-AE-D

安科瑞薛瑶瑶18701709087/17343930412 在单逆变器系统中,仪表直接与逆变器相连。如果您的变频器有一个内置的收入等级表(RGM;该变频器 被称为收入等级变频器),您可以在 RGM 的同一总线上连接一个外部仪表。

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…

波高仪:数字浪高仪解析

波高仪,也被称为数字浪高仪,是一种专门用于测量波浪高度的设备。它采用低功耗微处理器、24bit高精度AD转换器和长距离通信技术,配备电容式波高传感器,具有线性好、功耗低、量精度高、传输距离远、性能稳定、抗干扰能力强等特点。 …

vue中使用echarts实现X轴动态时间(天)的折线图表

项目要求x轴以一天为间隔&#xff0c;时间是动态返回的数据&#xff0c;折线图平滑展示 实现代码如下&#xff1a; <div class"echarts-main"><v-chart ref"echarts" :options"options" /> </div>// 局部引入vue-echarts im…

Python实现线性拟合及绘图

Python实现线性拟合及绘图 当时的数字地形实验&#xff0c;使用matplotlib库绘制了一张图表表示不同地形类别在不同分辨率下的RMSE值&#xff0c;并分别拟合了一条趋势线。现在来看不足就是地形较多时&#xff0c;需要使用循环更好一点&#xff0c;不然太冗余了。 代码逻辑 …

【讯为Linux驱动笔记1】申请一个字符设备

Linux下每个设备都需要有一个专属设备号&#xff1a;主设备号 次设备号 【申请字符设备】 主设备号&#xff1a;一类驱动&#xff1a;如&#xff1a;USB驱动 次设备号&#xff1a;这类驱动下的某个设备 如&#xff1a;键盘鼠标 设备号是32位的dev_t类型的&#xff0c;高12位主…

Python对Excel两列数据进行运算

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python对Excel两列数据进行运算 在日常工作中&#xff0c;经常会遇到需要对Excel表格中的数…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…

Python 数据可视化 boxplot

Python 数据可视化 boxplot import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns# 读取 TSV 文件 df pd.read_csv(result.tsv, sep\t)normal_df df[df["sample_name"].str.contains("normal")] tumor_df df…