用HTTP核心模块配置一个静态Web服务器

news/2024/4/26 14:44:14/文章来源:https://blog.csdn.net/qq_62309585/article/details/128105653

1.预备知识

静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现,
当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的。
所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等
HTTP配置项自然必须全部在http{}块之内,这里的直属于是指配置项直接所属的大括号
对应的配置块),同时,在描述每个配置项的功能时,会说明它可以在上述的哪个块中存
在,因为有些配置项可以任意地出现在某一个块中,而有些配置项只能出现在特定的块中。
Nginx为配置一个完整的静态Web服务器提供了非常多的功能,下面会把这些配置项分为
以下8类进行详述:
虚拟主机与请求的分发
文件路径的定义
内存及磁盘资源的分配
网络连接的设置
MIME类型的设置
对客户端请求的限制
文件操作的优化
对客户端请求
这种划分只是为了帮助大家从功能上理解这些配置项

2虚拟主机与请求的分发

由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时
nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义
虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,
一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了

(1)监听端口

listen address:port[default(deprecated in 0.8.21)|default_server|
[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|
bind|ipv6only=[on|off]|ssl]]

解释

1.address:port  :

listen 127.0.0.1:8000;
listen 127.0.0.1; #注意:不加端口时,默认监听
80端口
2.使用ipv6
listen [::]:8000;
listen [fe80::1];
listen [:::a8c9:1234]:80;
3 default  default_server
将所在的server块作为整个Web服务的默认server块。如果没有设置这个参数,
那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机
呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机
4 backlog=num
表示TCP中backlog队列的大小。默认为–1表示不予设置。在TCP建 立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。 可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会 建立连接失败
5.
rcvbuf=size:设置监听句柄的SO_RCVBUF参数。
·
sndbuf=size:设置监听句柄的SO_SNDBUF参数。
·
accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。

deferred

在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手, 内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已 经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大 并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理 这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配 置

7 bind

绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时
才会生效
8.ssl
在当前监听的端口上建立的连接必须基于SSL协议。
ssl:

SL协议的三个特性

① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密;

② 鉴别:可选的客户端认证,和强制的服务器端认证;

③ 完整性:传送的消息包括消息完整性检查(使用MAC)。

(2) server_name 

语法: server_name name[...];
默认: server_name"";
配置块  server
server_name后可以跟多个主机名称,
server_name www.testweb.com 、 download.testweb.com;
在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的
server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host
多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。
server_nameHost的匹配优先级如下

1)首先选择所有字符串完全匹配的server_name,如www.testweb.com
2)其次选择通配符在前面的server_name,如*.testweb.com
3)再次选择通配符在后面的server_name,如www.testweb.*
4)最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$
如果Host与所有的server_name都不匹配,这时将会按下列顺序选 择处理的server块。
1)优先选择在listen配置项后加入[default|default_server]的server块。
2)找到匹配listen端口的第一个server块
3)server_names_hash_bucket_size  server_names_hash_max_size
语法: server_names_hash_bucket_size size;
默认: server_names_hash_bucket_size 32|64|128;
配置块: http、server、location语法: server_names_hash_max_size size;
默认: server_names_hash_max_size 512;
配置块: http、server、location
为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server_name
server_names_hash_bucket_size设置了每个散列桶占用的内存大小。  
erver_names_hash_max_size会影响散列表的冲突率。server_names_hash_max_size越大,
消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更server_names_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能增高

(5)重定向主机名称的处理

语法: server_name_in_redirect on|off;
默认: server_name_in_redirect on;
配置块: http、server或者location
该配置需要配合server_name使用。在使用on打开时,表示在重定向请求时会使用
server_name里配置的第一个主机名代替原先请求中的Host头部,而使用off关闭时,表示在重
定向请求时使用请求本身的Host头部。

(6)location

语法: location[=|~|~*|^~|@]/uri/{...}
配置块 server 
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择
location{}块中的配置来处理用户请求。
当然,匹配方式是多样的,下面介绍location的匹配规则(可使用正则表达式)
1=表示把URI作为字符串,以便与参数中的uri做完全匹配
2~表示匹配URI时是字母大小写敏感的。
3~*表示匹配URI时忽略字母大小写问题。
4^~表示匹配URI时只需要其前半部分与uri参数匹配即可。
5@表示仅用于Nginx服务内部请求之间的重定向,带有@location不直接处理用户请
注意
1.location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会
被第一个location处理
2.在以上各种匹配方式中,都只能表达为如果匹配......”。如果需要表达如果不匹配...
...”,就很难直接做到。有一种解决方法是在最后一个location中使用/作为参数,它会匹配
所有的HTTP请求,这样就可以表示如果不能匹配前面的所有location,则由“/”这个location
理。例如
location / {
# /可以匹配所有请求
…
}

文件路径的定义

1)以root方式设置资源路径

语法: root path;
默认: root html;
配置块: http、server、location、if

例子:

location /download/ {
root optwebhtml;
}
在上面的配置中,如果有一个请求的URI/download/index/test.html,那么Web服务器将
会返回服务器上optwebhtmldownload/index/test.html文件的内容。

(2)以alias方式设置资源路径

语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location
面的uri参数,这将会致使aliasroot以不同的方式将用户请求映射到真正的磁盘文件上。例
如,如果有一个请求的URI/conf/nginx.conf,而用户实际想访问的文件:
location conf {
alias usr/local/nginx/conf/;
}
如果用root设置,那么语句如下所示:
location conf {
root usr/local/nginx/;
}
使用alias时,在URI向实际文件路径的映射过程中,已经把location后配置的/conf这部分
字符串丢弃掉,因此,/conf/nginx.conf请求将根据alias path映射为path/nginx.confroot则不
然,它会根据完整的URI请求来映射,因此,/conf/nginx.conf请求会根据root path映射为
path/conf/nginx.conf。这也是root可以放置到httpserverlocationif块中,而alias只能放置
location块中的原因

(3)访问首页

语法: index file...;
默认: index index.html;
配置块: http、server、location
有时,访问站点时的URI/,这时一般是返回网站的首页,而这与rootalias都不同。
这里用ngx_http_index_module模块提供的index配置实现。index后可以跟多个文件参数,Nginx
将会按照顺序来访问这些文件,例如:
location {
root path;
index index.html htmlindex.php /index.php;
}
接收到请求后,Nginx首先会尝试访问path/index.php文件,如果可以访问,就直接返回文
件内容结束请求,否则再试图返回pathhtmlindex.php文件的内容,依此类推。

(4)根据HTTP返回码重定向页面

语法: error_page code[code...][=|=answer-code]uri|@named_location
配置块: http、server、location、if
解释:
1.
当对于某个请求返回错误码时,如果匹配上了error_page中设置的code,则重定向到新
URI中。例如:
error_page 404 404.html;
error_page 502 503 504 50x.html;
error_page 403 http://example.com/forbidden.html
;
error_page 404 = @fetch;

2.虽然重定向了URI,但返回的HTTP错误码还是与原来的相同。用户可以通 过“=”来更改返回的错误码,例如

error_page 404 =200 empty.gif;
error_page 404 =403 forbidden.gif;

3. 如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,那么可以 这样设

location / (
error_page 404 @fallback;
)
location @fallback (
proxy_pass http://backend
;
)

(5)是否允许递归使用error_page

语法: recursive_error_pages[on|off];
默认: recursive_error_pages off;
配置块: http、server、location
(6)try_files
语法: try_files path1[path2]uri;
配置块: server、location
try_files后要跟若干路径,如path1 path2...,而且最后必须要有uri参数,意义如下:尝试
按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结
束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数
uri上。因此,最后这个参数uri必须存在,而且它应该是可以有效重定向的
try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
location @other {
proxy_pass http://backend
;
}
上面这段代码表示如果前面的路径,如systemmaintenance.html等,都找不到,就会反向
代理到http://backend 服务上。还可以用指定错误码的方式与error_page配合使用,例如
location {
try_files $uri $uri /error.phpc=404 =404;
}

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

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

相关文章

Win,M1Mac上安装jupyter的MATLAB支持插件的方法

tags: MATLAB Win Mac Tips 写在前面 11月的最后一天了, 总结一下支持MATLAB的一个jupyter的插件, 有了这个你就可以在jupyter notebook或者jupyter lab上面使用MATLAB语句了, 还是很不错的, 虽然我安装了好久… 下面来说一下我在我的电脑以及朋友的电脑(Win11)上面安装这个…

实例方法(instance method)、类方法、构造方法(三)

实例方法(没有static)的概念 对象被称为实例。实例相关的有:实例变量、实例方法。实例变量是对象变量。实例方法是对象方法。实例方法没有static。(对象方法,对象级别的方法) 实例方法的调用需要先new一个…

高维多元时序数据聚类

1. 简介 收集数据的能力不断增强,使我们有可能收集大量的异构数据。在可用的异构数据中,时间序列代表着尚未被充分探索的信息母体。当前的数据挖掘技术在分析时间序列时存在多个缺点,尤其是在应同时分析多个时间序列(即多维时间序…

JVM运行时数据 堆

JVM运行时数据 堆快速调试堆参数设置堆分类运行流程Minor GC、Major GC与Full GC分代思想内存分配策略TLAB堆空间参数设置快速调试 一个JVM实例只存在一个堆内存,对也是Java内存管理的核心区域Java 堆区在Jvm启动的时候创建,其空间大小也就确定了。是JV…

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发,效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

分层架构理论基础

一、三层架构 1、什么是三层架构 三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分为:表示层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层…

数仓之hive自定义UDTF函数详解

学习目录一、自定义UDTF函数一、自定义UDTF函数 1.说明文档 A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the initialize, process, and possibly close methods. The initialize method is called by Hive to notify t…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统,打开hadoop2.修…

高效率开发Web安全扫描器之路(一)

一、背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下…

安卓版微信8.0.31内测版出炉:安装包变小,功能变多!

人是社会性生物,建立依恋、经营亲密关系是人的本能,只不过到了网络时代之后,用户进行交流的方式几乎都变成了微信等社交软件。 不仅可以让用户很便捷的和朋友进行沟通,并且在上班办公的时候,也是可以轻松传输文件等&a…

MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

一、准备工作 首先需要准备好环境,包含必要的软件,痞子衡的环境如下: 集成开发环境: MCUXpresso IDE_11.6.0_8187,点此下载软件开发包: SDK_2.12.1_EVK-MIMXRT1170(Toolchain需包含MCUXpresso I…

Compose学习-> Text()

设置文本:text xxx 直接设置 Text(text "我是一个Text")引用资源文件:stringResource Text(text stringResource(id R.string.string_text))设置字体颜色:color xxx 引用系统自带的颜色 Text(text "我是一个Text"…

【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图仿真源代码实物图答辩论文答辩PPT) 文章目录typora-root-url: ./【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图仿真源代码实…

C++习题2

指针调用数组元素 指针调用数组元素 int a[3][4] {{1,4,7,10},{2,5,8,11},{3,6,9,12}};int* pa[3] { a[0],a[1],a[2] };int(*pb)[4]; pb a;int** q pa;cout << *(a[2] 3)<<endl;cout << *(*(pa 2) 3)<<endl;cout << pb[2][3]<<en…

【JavaWeb】Filter

文章目录1.Filter过滤器2.Filter的初体验3.Filter的生命周期4.FilterConfig类5.FilterChain过滤器链6.Filter的拦截路径1.Filter过滤器 (1).概念及作用 Filter过滤器是JavaWeb的三大组件之一三大组件分别是:Servlet程序,Listener监听器,Filter过滤器Filter过滤器是JavaEE的规…

MBA管理类联考英语二题型答题时间及次序问题

还有不到一个月时间&#xff0c;2023年MBA联考也进入到最后的收官阶段&#xff0c;这个阶段对于多数已经系统复习过的考生&#xff0c;一般需要进行通盘梳理备考&#xff0c;而不是专注于单个模块的复习。在做试卷或真题的过程中&#xff0c;如何才能更有利于分数这个问题需要大…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话&#xff1a;又一年快过去了&#xff0c;回想刚刚开始在CSDN上写笔记&#xff0c;还是2年前的事情。闲人其实是一个拖延症十分严重的人&#xff0c;自从开始走上写作这条路之后&#xff0c;治疗拖延症找到了办法&#xff0c;每天总有一些事情让闲人去思考&#xff0c;然…

Miniconda:在pycharm的terminal中无法使用Conda命令

在pycharm的terminal中无法使用Conda命令 问题&#xff1a; 在本地下载好conda系列后&#xff0c;在pycharm的terminal中无法使用conda命令 问题分析&#xff1a; 说的很清楚了&#xff0c;是因为当前支持的shells没有初始化conda 所以我们只需要把Shell 路径改成激活cond…

如何制作一个微信小程序【微信小程序是怎么做的】

为什么现在这么多人使用微信小程序呢&#xff1f;因为微信小程序除了便捷易开发&#xff0c;公司企业可以用来做小程序展示官网&#xff0c;商家也可以做小程序商城&#xff0c;甚至个人也可以拥有自己的小程序。那么如何制作一个微信小程序&#xff1f;微信小程序是怎么做的呢…