热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nginx短篇(2):第一个静态web服务器

所属分类:nginx
  • A+

所属分类:nginx 运维技术

这仍然是一篇为初学者准备的文章,有一定基础的朋友就不用看了。

在我不了解一个技术之前,先灌输一大堆专业概念会让我比较反感,所以我们不如先设定一个目标,一边动手,一边来理解nginx。

今天的目标就是利用nginx搭建一个静态的web服务器,然后访问这个web服务中的一些资源,通过这个目标,来了解nginx的一些基础目录结构和基础语法。

首先,请确保你已经安装了nginx,安装方法可以参见上一篇文章,链接如下:

nginx短篇(1):安装nginx

以上述链接中的安装方法为准,我们知道,有两种方式可以安装nginx,通过yum源或者通过编译,但是通过两种方式安装后的nginx的目录结构略有不同,默认提供的资源与配置略有不同,所以,我们暂且先以编译安装的方式进行介绍,之后再按照yum源安装的方式进行介绍,以免发生混淆。

我已经将nginx编译安装到了srv目录,在没有启动过nginx的情况下,/srv/nginx目录的结构如下

# ll /srv/nginx/
total 20
drwxr-xr-x 2 root root 4096 Jan 17 20:26 conf
drwxr-xr-x 2 root root 4096 Jan 17 18:32 html
drwxr-xr-x 2 root root 4096 Jan 17 18:32 logs
drwxr-xr-x 2 root root 4096 Jan 17 18:32 modules
drwxr-xr-x 2 root root 4096 Jan 17 18:32 sbin

此处我们大致介绍一下上述目录的作用,之后会详细的进行解释,如果疑问,不必纠结:

conf目录中存放了nginx相关的配置文件。

html目录是默认提供的web服务的"根目录"。

logs目录是nginx日志的存放目录。

modules目录中存放了一些模块会用到的库。

sbin目录中存放了nginx的二进制文件,我们需要使用nginx二进制文件启动nginx。

好了,我们并没有做任何其他配置,那么现在让我们来启动之前安装好的nginx,命令如下:

# /srv/nginx/sbin/nginx

执行上述命令即可启动nginx

nginx启动以后,我们就可以访问它了,虽然我们没有进行任何配置,但是nginx会默认为我们创建一个http服务器,这个默认的http服务会监听在80端口上,安装nginx的虚拟机IP地址是10.1.1.72,访问这个IP地址即可访问到nginx的默认提供的http服务,如下:

nginx短篇(2):第一个静态web服务器

如上图所示,我们看到的页面是nginx默认提供的一个html页面,在 [http基本概念] 一文中我们提到过,网络上的资源不是凭空产生的,都是别人为我们准备好的,上图中默认的html页面也是一个提前准备好的资源,那么,这个html页面到底放在了哪里呢?它就在nginx的html目录中,如下:

# ls /srv/nginx/html/
50x.html  index.html

刚才访问到的html页面就是此目录中的index.html页面,稍后我们会解释为什么默认会访问这个index.html文件。

我们知道,nginx的最核心的功能就是提供http服务,而且刚才已经演示过,安装nginx以后,即使不做任何配置,nginx也会默认提供一个http服务供我们使用,其实,之所以有默认的http服务可以使用,是因为nginx的配置文件中默认就有对应的配置,我们一起来看看这个配置文件,它就是conf目录中的nginx.conf配置文件,这个配置文件是nginx的主配置文件,我们大多数的配置工作都要在这个配置文件中完成,所以,我们先打开这个文件看个究竟。

默认情况下,nginx.conf文件中会有很多注释的行,这些注释行是nginx官方为我们准备的一些配置示例,如果你没有参考这些示例的需求,完全可以将这些行删除掉,从初学者的角度考虑,我们先把这些注释行删除,以免从心里上带来负担,不要着急,这些配置并不困难,我们会慢慢搞懂它们的,此处,我先执行如下命令,将默认的注释行删除。

# sed -i '/^[[:space:]]*#/'d nginx.conf

同时,为了演示方便,我删除了一些没用的空行,最终,nginx.conf中真正有用的部分如下:

nginx短篇(2):第一个静态web服务器

其实,就是因为有上述配置的存在,nginx才能为我们提供一个默认的http服务, 我们暂且先放下这个配置文件不管,来聊聊nginx的基本配置语法,等聊完这些基本语法,再来看上图中的配置,就简单多了。

先来说说最常用到的配置语法,示例如下:

http {
	
	...
	...
	
	server {
		...
		...
		
		location ... {
				...
				...
		}
		
	}
 
	server {
		...
		...
	}
	
 
}

从上述语法配置示例可以看出,上述示例可以分为几个逻辑部分,http部分、server部分、location部分,或者说,上述示例可以分为几个逻辑块,http块、server块、location块,聪明如你一定看出来了,每个"配置块"都是使用大括号"{  }"作为分界线的,而且,从缩进可以看出,它们是有层级关系的,http中可以配置多个server,一个server中可以配置多个location,我们知道,nginx最基础的功能就是用来提供http服务,所以,跟http有关的公共配置,可以放置在http块中,http块中又可以配置多个server,那么server代表了什么呢?我们在一台主机中安装了nginx,那么能不能让这台nginx主机同时提供多个web服务呢?答案是肯定的,每一个server就代表一个http服务,我们可以同时配置多个server,以便同时提供多个http服务,不同的server可以使用不同的配置,写入到某个server块中的配置只对对应的http服务生效,如果多个server存在共同的公用配置,则可以将共同的配置写在http块中,以便多个server共享这些配置,一个server块中又可以有一个或多个location,location又是什么意思呢?当我们访问一个网络上的资源时,都是通过url访问的,你可以把location当做url的一部分,此处,我们使用如下url作为示例:

http://www.zsythink.net/archives/1591

上述链接中的"/archives"部分就是一个location,我们可以通过location将url中的路径和服务器的某个目录建立起关联关系,此处不用纠结,在用到它时我们再来细说。

通过上述描述,你应该已经对刚才的nginx.conf有了一个初步的了解,nginx.conf中包含了我们最常用到的配置块:http块、server块和location块,当然,nginx中不止有这三种块,还有一些其他的块,比如events块、stream块等,还是那句话,先有一个大致概念,细节之处用到了再说,了解了上述概念以后,再回过头来看刚才的配置文件,是不是觉得顺眼多了,你可能已经发现了,示例中的nginx.conf中有一些配置不在任何"块"中,而是放在了nginx.conf文件的最顶部,比如"worker_processes"配置项,它没有配置到任何一个块中,而是配置的到了这些"块"之外的最上方,你可以把最上方这一片区域理解成"全局配置区"或者"主配置区",我们暂且把这片区域称之为"main"配置区,"main"配置区不属于任何一个块。

你也会从nginx.conf中看到各种各样的配置项,比如刚才提到的"worker_processes",以及你在示例文件中看到的"include"、"listen"等,我们可以把这些配置项称之为"配置指令",而配置指令后面通常会跟随一个或多个"值",我们也可以称这些"值"为"配置参数",一个配置指令通常会跟随一个或多个配置参数,想要正确的配置这些指令,最好先理解这些指令对应的功能,不过此处,我们先搞明白它们的基本配置语法,细心如你一定发现了,每个指令都是以分号结尾的,分号代表了指令的配置结束,没添加一个配置指令,都不要忘记加分号,否则会因为配置语法错误,而导致无法正常启动nginx,为了清晰明了,方便查看,通常每个指令单独配置在一行中,你也可以将多个指令配置在一行中,每个指令用分号隔开,但是大家通常不会这样做。

再来回过头来聊聊"块",从示例中的各种块可以看出,块的基本结构就是大括号"{ }",每个块后面都有一对大括号,"{"代表块配置的开始,"}"代表块配置的结束,而"块"和"配置指令"是有一定的对应关系的,比如,某些配置指令只能在http块中配置,某些配置指令只能在server块中配置,某些配置指令只能在location块中配置,有些配置指令既能在server块中配置又能在http块中配置,而有些配置指令只能在main区中进行配置,比如刚才提到的"worker_processes"配置项,就只能在main区中配置,不能配置在块中,那么哪些配置指令能在哪些块中进行配置呢?让我们记住所有指令与块的对应关系显然不太可能,我们可以通过官网查看对应的指令都能在哪些块中进行配置,以及指令的具体作用,具体方法会在之后的文章中进行介绍。

刚刚在准备nginx.conf示例文件时,我已经通过命令把注释行去掉了,如你所见,在nginx配置文件中,也是使用"#"作为注释符的。

好了,读到此处,我们再来仔细看看刚才的nginx.conf配置文件,我们知道,nginx会提供一个默认的http服务,这个服务其实就是nginx.conf中默认配置的一个server块,如上述示例文件nginx.conf所示,这个默认server监听在80端口上,没错,"listen 80;"这条指令就是用来配置server所监听的端口的,当我们访问一个http网站时,如果没有明确指明端口,默认会访问80端口。

正如本文开头的示例所示,当我访问"http://10.1.1.72/"这个网址时,默认会访问到nginx服务器上的/srv/nginx/html/index.html文件,之所以会访问到这个文件,是由下面这段配置决定的:

nginx短篇(2):第一个静态web服务器

刚才说过,location可以理解成url的一部分,那么当我们访问"http://10.1.1.72/"这个url时,这个url的最后一个"/"其实就是上图中的"location /

",换句话说就是,上图中红线标记出的"/"其实对应的就是"http://10.1.1.72 / "这个url的最后一个" / ",这个location块中有两条配置指令,它们分别是root和index,root配置项是什么意思呢?root配置指令的意思是:当前location所对应的文档根目录是哪里,"root html;"表示当前location的文档根目录是html目录,那么"文档根目录"又是什么意思呢?说白了,文档根目录的意思就是当有人访问"/"这个路径时,去服务器的哪个目录中找对应的资源,举个例子,如果我在html目录中放了一张图片,图片名为a.jpg,那么我就能通过"http://10.1.1.72 /a.jpg "访问到这张图片,url中的"/"对应了"location /"配置段,而"location /"又对应到了服务器的html目录,所以,url中的"/"就与服务器的html目录建立了对应关系,当我们访问"http://10.1.1.72 /a.jpg "这个地址时,其实访问的是服务器上html目录中的a.jpg,再换句话说,html目录就是当前location的资源目录。注意,上例中的html路径是一个相对路径,表示nginx安装目录中的html目录,因为我将nginx安装到了/srv/nginx目录中,所以上例中的html目录的绝对路径就是"/srv/nginx/html/",你可以在"/srv/nginx/html/"目录中放一张a.jpg图片,然后尝试使用"http://10.1.1.72/a.jpg"这个地址访问它,其实,要想完全搞明白location还是要费一番口舌的,不要怕,后面会有专门总结location的文章。

说完root指令,再聊聊index指令,index指令表示当没有指明任何资源时,默认访问哪个资源,什么意思呢?仍然拿刚才的url作为示例,当我们访问"http://10.1.1.72 /a.jpg "这个地址时,nginx知道我们想要获取a.jpg这张图片资源,但是如果我们直接访问"http://10.1.1.72 / "这个地址,没有指明我们想要获取什么,那么nginx会默认去把index.html或者index.htm返回给我们,原因就是上图中配置的"index  index.html index.htm;"起的作用。

好了,通过上述描述,你的脑海中应该已经有了大致的框架与概念,有了自己的理解以后,剩下的就好办了。

刚才我们所有的描述都是基于编译安装的方式进行的,由于通过yum源安装nginx后的目录结构与编译安装后的目录结构略有不同,所以此处我再将两种方式安装后的区别与注意点描述一下。

编译安装后,我们通过如下二进制文件启动nginx

/nginx安装路径/sbin/nginx

通过yum源安装nginx后,对应的二进制文件已经自动拷贝到了/usr/sbin目录中,而此目录默认已经加入到环境变量中,所以我们可以在任意目录直接执行"nginx"命令启动nginx

编译安装后,nginx相关的配置文件存放在如下路径中

/nginx安装路径/conf/

而通过yum源安装nginx后,相关的配置文件存放在如下路径中

/etc/nginx/

通过编译安装的方式安装nginx以后,默认的"server块"直接配置到了nginx.conf文件中,而通过 官方yum源 安装nginx后,默认的"server块"会配置在"/etc/nginx/conf.d/default.conf"文件中,换句话说就是,如果你通过官方yum源安装了nginx,那么你在/etc/nginx/nginx.conf文件中无法找到默认提供的server块,只能在/etc/nginx/conf.d/default.conf文件中找到默认的server块,这是为什么呢?其实,我们从/etc/nginx/nginx.conf文件中就能找到答案,打开/etc/nginx/nginx.conf文件,查看默认的http块的配置,你会在http块中发现如下配置指令

include /etc/nginx/conf.d/*.conf;

出现上述情况的根本原因就在于这条配置指令,include指令表示将指定的文件中的内容包含到当前位置中,举个例子,如果我在http配置块中的第三行设置了"include  test.conf;"指令,那么test.conf文件中的所有内容都会替换到http配置块的第三行,换句话说就是,虽然文本内容写在test.conf文件中,但是通过include指令替换后,相当于test.conf中的文本写在了http块中的第三行。

那么,理解了include指令的作用以后,再回过头看刚才的配置,就一目了然了。

"include /etc/nginx/conf.d/*.conf;"这条指令的作用就是将"/etc/nginx/conf.d/*.conf"文件中的内容替换到当前指令所在的位置,由于使用了"*"作为通配符,所以/etc/nginx/conf.d/目录中所有以".conf"作为后缀名的文件都会被匹配到,/etc/nginx/conf.d/default.conf文件自然也会被匹配到,所以最终,http块中include指令所在位置的文本内容会被替换成/etc/nginx/conf.d/default.conf文件中的内容,而/etc/nginx/conf.d/default.conf文件中的内容恰好是默认提供的server块配置,当然,如果你在/etc/nginx/conf.d/目录中放了一些其他以".conf"结尾的文本文件,那么这些文件中的内容也会因为刚才的include指令而被包含到nginx.conf文件中。

综上所述,通过官方yum源安装nginx后,虽然/etc/nginx/nginx.conf文件中看不到默认server块的配置,但是并不代表没有提供默认的server块配置,只是通过include指令的方式,将默认server块的配置单独放置在了/etc/nginx/conf.d/default.conf文件中,最终效果与直接将server块配置写入到http块中无异。其实,即使是通过编译安装的方式安装的nginx,也可以借鉴这种配置方式,当我们配置了多个server块时,可以将各个server块分别提取出来,单独放置到一个配置文件中,然后再使用include指令引用对应的配置文件,这样就能从逻辑上将各个server块的配置隔离到不同的配置文件中,结构上更加分明,也方便我们进行配置管理,这些操作在以后都会进行实际的演示,不必着急,此时,你只要搞明白大概的原理即可。

通过官方yum安装后,如果你查看了/etc/nginx/conf.d/default.conf中提供的默认server块配置,那么你会发现,默认server块中的location块配置的root指令对应的路径是"/usr/share/nginx/html",也就是说,默认提供的server对应的文档根目录是此路径,我们需要将对应的资源放置到此目录中,即可通过默认的服务进行访问了。

其实,上述注意点多数是因为两种安装方式的默认路径和结构的不同造成的,如果你是通过yum源安装了nginx,那么你可以通过如下命令查看安装nginx后都使用到了哪些目录和文件。

# rpm -ql nginx

如果你没有使用官方yum源,而是使用了epel源安装了nginx,那么配置文件和默认的index.html页面可能又是另外一番样子了,但是只要搞明白原理,都是可以轻松应对的。

好了,本来是准备写一些nginx短篇文章,结果不知不觉就越写越长了,如果你觉得这篇文章对你有所帮助,可以点击微信文章链接中的"好看"以鼓励作者,"好看"的数量会推进下一篇文章的诞生,加油,共勉~

nginx短篇(2):第一个静态web服务器

我的微信公众号

关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
author-avatar
蹲点爱琴海
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有