Nginx快速入门及配置文件结构

news2025/7/6 15:00:54

Nginx快速入门教程

  • Nginx 简介
  • Nginx 特性
  • Nginx 架构
  • Nginx 相比Apache的优点
  • Nginx 的安装
  • 启动、停止和重新加载 Nginx 配置
  • Nginx 配置文件结构
  • Nginx 工作流程
  • 总结
  • 后言

Nginx 简介

Nginx是 HTTP 和反向代理服务器,邮件代理服务器,以及 Igor Sysoev 最初编写的通用 TCP/UDP 代理服务器。
Nginx具备如下功能:

  1. 基本的 HTTP 服务器功能。
  2. 其他 HTTP 服务器功能(虚拟服务器、管道连接、限流等等)。
  3. 邮件代理服务器功能。
  4. TCP/UDP 代理服务器功能。

Nginx是一个主和几个工作进程;工作进程在非特权用户下运行。Nginx可以灵活配置, 重新配置和升级可执行文件,而不会中断客户端服务。

经过测试的操作系统和平台:

  1. FreeBSD 3 — 11 / i386; FreeBSD 5 — 11 / amd64;
  2. Linux 2.2 — 4 / i386; Linux 2.6 — 4 / amd64; Linux 3 — 4 / armv6l, armv7l, aarch64, ppc64le;
  3. Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
  4. AIX 7.1 / powerpc;
  5. HP-UX 11.31 / ia64;
  6. macOS / ppc, i386;
  7. Windows XP, Windows Server 2003.
访问
客户端
Nginx
服务器1
服务器2
服务器3
......
服务器n

Nginx用在哪里(应用场景)?互联网应用很多都有使用到nginx,是最外层的网关‘;比如腾讯课堂、网易邮箱等。
ke_nginx

Nginx 特性

Nginx使用可扩展的事件驱动架构,而不是更传统的过程驱动架构。这需要更低的内存占用,并且当并发连接扩大时,使内存使用更可预测。

Nginx开发的目标是实现 10 倍以上的性能,优化服务器资源的使用,同时也能够扩展和支持网站的动态增长。 因此,Nginx成为最知名的模块化,事件驱动,异步,单线程 Web 服务器和 Web 代理之一。

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有很多非常优越的特性:
(1)作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。
(2)作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP 代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
(3)作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器,能够在 不间断服务的情况下进行软件版本的升级。

Nginx 架构

从一开始 nginx 就是一个专门的工具,可以实现更高性能,更密集和经济地使用服务器资源,同时实现网站的动态发展,所以它采用了不同的模式。 随着发展变成是一个模块化的,事件驱动的,异步的,单线程的非阻塞架构的 nginx 代码基础。
nginx_arch
nginx 大量使用复用和事件通知,并专门用于分离进程的特定任务。 连接在有限数量的单线程进程称为工作(worker)的高效运行循环中处理。 在每个工作(worker)中,nginx 可以处理每秒数千个并发连接和请求。

Nginx 相比Apache的优点

Apache也是HTTP服务器,也可以做网关,早期使用Apache比较多,但随着Nginx的发展,Nginx越来越用的多。

  1. Nginx是纯C的代码风格进行模块化开发,让人更容易接受。
  2. Nginx的版本迭代比较频繁。
  3. Nginx提供的文档资料相当齐全。
  4. Nginx容易应用。
  5. 跨平台,兼容性好。

Nginx 的安装

可以通过系统命令安装:

sudo apt-get install nginx

也可以通过源码编译,安装之前需要提前好Nginx的必备软件/库。
笔者写了一篇Linux下Nginx的安装和配置教程,可以参考一下。这里再把Nginx的安装过程再罗列一遍。

准备第三方支持库源码:
(1)nginx-1.13.7.tar.gz :Nginx的源码。
(2)openssl-1.1.0g.tar.gz :Nginx支持https,需要这个库做一些加密和解密。
(3)pcre-8.41.tar.gz :正则表达式的库,Nginx用来做正则式匹配。
(4)zlib-1.2.11.tar.gz :压缩库。

wget https://sourceforge.net/projects/pcre/files/pcre/8.41/pcre-8.41.tar.gz --no-check-certificate
wget https://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz --no-check-certificate
wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz --no-check-certificate
wget http://nginx.org/download/nginx-1.13.7.tar.gz

解压每个包:

tar xzvf nginx-1.13.7.tar.gz
tar xzvf openssl-1.1.0g.tar.gz
tar xzvf pcre-8.41.tar.gz
tar xzvf zlib-1.2.11.tar.gz

编译Nginx:

./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/home/fly/workspace/pcre-8.41 --with-zlib=/home/fly/workspace/zlib-1.2.11 --with-openssl=/home/fly/workspace/openssl-1.1.0g

注意zlib、pcre、openssl的路径要改为自己的路径。
执行结果:

checking for OS
...
Configuration summary
  + using PCRE library: /home/fly/workspace/pcre-8.41
  + using OpenSSL library: /home/fly/workspace/openssl-1.1.0g
  + using zlib library: /home/fly/workspace/zlib-1.2.11

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

安装Nginx:

make
sudo make install

在/usr/local/目录下面,产生了 nginx 的目录。

conf  html  logs  sbin

Nginx的配置文件存放于conf/nginx.conf,bin文件是位于sbin目录下的nginx文件,logs是存放的启动日志、错误日志、运行日志等。

启动Nginx(需要sudo权限):

cd /usr/loacal/nginx
sudo ./sbin/nginx -c ./conf/nginx.conf

打开浏览器访问此机器的IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功:

nginx_http_show

启动、停止和重新加载 Nginx 配置

要启动 nginx,请运行可执行文件。 当 nginx 启动后,可以通过使用-s 参数调用可执行文件来控制它。 使用以下语法:

 nginx -s signal

信号(signal)的值可能是以下之一:
(1)stop - 快速关闭服务:要等待工作进程完成服务当前请求,该命令应该在启动 nginx 的同一用户下执行。
(2)quit - 正常关闭服务
(3)reload - 重新加载配置文件
(4)reopen - 重新打开日志文件

要重新加载配置文件,请执行:

nginx -s reload

当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。

发送 QUIT 信号正常关闭进程:

 kill -s QUIT `pid`

要获取所有运行的 nginx 进程的列表,可以使用 ps 命令,例如,以下列方式:

ps -ax | grep nginx

Nginx 配置文件结构

Nginx 由配置文件中指定的指令控制的模块组成。 指令分为简单指令和块指令。 一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾。

块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。 如果块指令可以在大括号内部有其他指令,则称为上下文(例如:events,http,server 和 location)。

配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。events 和 http 指令驻留在主上下文中,server 在 http 中的,而 location 在 http 块中。#号之后的一行的部分被视为注释。

手写一个简单的配置文件:

# test.conf
worker_processes 4;		#工作进程数量

events {
	worker_connections 1024;
}

http {
	server {
		listen 8888;	#监听端口
	}
}

这里没有配置自己的服务器目录,所以会默认访问/usr/local/nginx/html/index

# ls /usr/local/nginx/html/index
50x.html  index.html

worker_processes 4;配置的是工作进程数量。

$ ps -aux | grep nginx
root      11122  0.0  0.0  20676   384 ?        Ss   11:45   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fly.conf
nobody    11123  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11124  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11125  0.0  0.0  21100  2424 ?        S    11:45   0:00 nginx: worker process
nobody    11126  0.0  0.0  21100  2428 ?        S    11:45   0:00 nginx: worker process

Nginx可以放多个server,如下示例:

# test.conf
worker_processes 4;

events {
	worker_connections 1024;
}

http {
	server {
		listen 8888;
	}
	server {
                listen 8889;
        }
	server {
                listen 8890;
        }
	server {
                listen 8891;
        }
}

服务器的状态:

fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8888
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8889
tcp        0      0 0.0.0.0:8889            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8890
tcp        0      0 0.0.0.0:8890            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)
fly@fly-virtual-machine:/usr/local/nginx$ sudo netstat -anop | grep 8891
tcp        0      0 0.0.0.0:8891            0.0.0.0:*               LISTEN      11536/fly.conf   关闭 (0.00/0/0)

可以看到所有的服务器都在一个进程里面,该进程就是Nginx的master的主进程。也就是说四个server都是被Nginx的master进程监听。

$ ps -aux | grep nginx
root      11536  0.0  0.0  20684   408 ?        Ss   14:25   0:00 nginx: master process ./sbin/nginx -c conf/fly.conf
nobody    11537  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11538  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11539  0.0  0.0  21116  2396 ?        S    14:25   0:00 nginx: worker process
nobody    11540  0.0  0.0  21116  2400 ?        S    14:25   0:00 nginx: worker process

Nginx 工作流程

nginx 有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置,并维护工作进程。 工作进程对请求进行实际处理。 nginx 采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。 工作进程的数量可在配置文件中定义,并且可以针对给定的配置进行修改,或者自动调整到可用 CPU 内核的数量。

在配置文件中确定 nginx 及其模块的工作方式。默认情况下,配置文件名为 nginx.conf,并放在目录:/usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。

Nginx是由master进程监听,所有的请求都在worker进程处理。

TCP连接
http请求
客户端
master: listen
worker: action

那么如何做到在master进程监听,让 listen() 得到的listen fd进入到worker进程,然后可以在worker进程处理呢?
在master进行listen,listen之后进行fork()出子进程,这样master创建的 listen fd就可以被子进程继承了。

既然Nginx是有多个worker进程处理连接的,也就是存在多线程/多进程、多端口的情况,那么就势必会有惊群问题。这是客观问题。
Nginx内部是这么解决惊群问题的:在同一时刻,只有一个进程把listen fd加入epoll中

总结

  1. 了解Nginx的使用以及conf文件的运行原理;快速入门。

  2. 基础组件是指为程序提供API的动态库或静态库;中间件是指可以独立运行的,本身是独立的进程,和我们编写的程序是通过网络通信的程序(比如Redis、MySQL、Nginx等)。

后言

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接,详细查看详细的服务:C/C++服务器课程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传统防火墙与Web应用程序防火墙(WAF)的区别

前言 由于WEB应用防火墙&#xff08;WAF&#xff09;的名字中有“防火墙”三个字&#xff0c;因此很多人都会将它与传统防火墙混淆。实际上&#xff0c;二者之间的有着很大的差别。传统防火墙专注在网络层面&#xff0c;提供IP、端口防护。而WAF是专门为保护基于Web的应用程序…

学生用白炽灯好还是led灯好?2022最专业学生护眼灯推荐

现阶段的学生视力都普遍出现近视低龄化&#xff0c;所以在护眼方面&#xff0c;家长都非常重视的&#xff0c;有人问&#xff1a;学生用白炽灯好还是led灯好&#xff1f; 我的回答是LED灯更适合现在家庭使用&#xff0c;给大家分析一下。 白炽灯是由灯丝发热产生光亮&#xff…

多层串联拼接网络

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

Pytorch ——特征图的可视化

文章目录前言一、torchvision.models._utils.IntermediateLayerGetter*注意&#xff1a;torcvision的最新版本0.13&#xff0c;已经取消了pretrainedTrue这个参数&#xff0c;并且打算在0.15版正式移除&#xff0c;如果用pretrained这个参数会出现warring警告。现在加载与训练权…

【项目实战】springboot+vue舞蹈课程在线学习系统-java舞蹈课程学习打卡系统的设计与实现

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;评论区咨询即可。 本文目录1.开发环境2 系统设计2.1 背景意义2.2 技术路线2.3 主要研究内容3 系统页面展示3.1 学生3.2 教师页面3.3 管理员页面4 更多推荐5 部分功能代码5.1 查看学生打卡5.2 文件上传下载…

天翼云实时云渲染,助力打造世界VR产业大会云上之城

2022年11月12日&#xff0c;2022世界VR产业大会于江西南昌开幕。11月13日&#xff0c;以“共建元宇宙生态&#xff0c;点亮新数智未来”为主题的中国电信生态论坛召开。由天翼云携手新国脉数字文化股份有限公司&#xff08;简称“国脉文化”&#xff09;打造的元宇宙家园国脉大…

【力扣刷题】只出现一次的数字

&#x1f517; 题目链接 题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 …

java类的练习 -- 声明一个接口(Calculability),接口中

java类的练习 – 声明一个接口(Calculability)&#xff0c;接口中… 题目 编写一个应用程序&#xff0c;实现以下功能&#xff1a; ①声明一个接口(Calculability)&#xff0c;接口中包含一个方法area()。 ②声明一个三角形类实现该接口&#xff0c;类名为Triangle&#xf…

React源码分析2-深入理解fiber

react16 版本之后引入了 fiber&#xff0c;整个架构层面的 调度、协调、diff 算法以及渲染等都与 fiber 密切相关。所以为了更好地讲解后面的内容&#xff0c;需要对 fiber 有个比较清晰的认知。本章将介绍以下内容&#xff1a; 为什么需要 fiberfiber 节点结构中的属性fiber 树…

AR眼镜新秀雷鸟创新,究竟能飞多远?

时隔近十年之后&#xff0c;消费级AR眼镜又重新高调回归大众视野。 自去年10月开始&#xff0c;以OPPO、小米为代表的国内大厂纷纷推出试验性AR眼镜&#xff0c;谷歌第二代AR眼镜更是作为压轴在I/O大会上重新回归&#xff0c;苹果多年来不断提及但始终“难产”的AR产品&#x…

平衡二叉树(AVL树)

1.简介 1.二叉排序树的问题: 如果原始是数据是排好序的(如1,2,3,4,5,6),那么最终创建的二叉排序树的结构就会变成一条斜线,类似于一条单链表,此时如果需要查找/插入某个元素就要一个一个元素的比较,这样就没有优势了.由于每次都要比较左子树,其查询速度甚至比单链表还慢; 2.对…

labview 写入文本到word报表(标签方法)

描述labview按预先定义的包含数个标签的模板&#xff0c;复制模板到新文件&#xff0c;写入文本到各标签位置。 图1 前面板 图2 程序框图 图3 Ms office report 图4 配置Ms office report的属性1 图5 配置Ms office report的属性2

在vue2项目中使用vue-quill-editor实现富文本编译器

1 安装 npm install vue-quill-editor --save 2 引入 有两种引入方式 &#xff08;1&#xff09;全局引入(main) import VueQuillEditor from vue-quill-editor//调用编辑器 // 样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist…

浅谈无脚本自动化测试

在当今的企业环境中&#xff0c;软件测试不再被视为不必要的投资&#xff1b;相反&#xff0c;它已经上升到一种需要而不是奢侈品的水平。随着市场的不断变化和竞争的加剧&#xff0c;企业必须做一些让他们与竞争对手区分开来的事情。 为了使自己与众不同&#xff0c;公司必须提…

【1-系统架构演进过程】

特别说明:接下来我会和大家一起完成一个商城项目&#xff0c;这个项目涉及的内容以及技术不仅多&#xff0c;而且都是现在主流的开发技术&#xff0c;每天我会按时更新博客内容&#xff0c;详细记录学习的过程&#xff0c;感兴趣的同学可以和我一起完成&#xff0c;但是时间较长…

国际贸易详解:国际贸易主要有哪些分类标准和运输方式

国际贸易主要的分类标准包括按商品流向分为出口贸易&#xff0c;进口贸易和过境贸易&#xff0c;按商品形态分为有形贸易和无形贸易&#xff0c;按运输方式分为陆运贸易&#xff0c;海运贸易等。一、国际贸易主要有哪些分类标准 1、按商品流向分为出口贸易、进口贸易、过境贸易…

2022英特尔® FPGA中国技术周

本文图片均来自于2022英特尔 FPGA中国技术周线上会议 11.14 全新的中端和以边缘为中心的FPGA 英特尔 Agilex™ FPGA的下一代接口协议 11.15 Nios V: 基于FPGA的RISC-V处理器 英特尔 Quartus Prime开发软件 基于FPGA的人工智能开发套件 Case 使用oneAPI高级语言开发IP​ 将…

油罐清洗抽吸系统设计

目录 摘要 - 1 - Abstract - 2 - 1 引言 - 3 - 1.1课题的背景和意义 - 3 - 1.1.1课题的背景 - 3 - 1.1.2课题的意义 - 3 - 1.2国内外油罐清洗抽吸系统的研究情况 - 3 - 2 油罐清洗抽吸系统总体设计方案 - 6 - 2.1油罐清洗抽吸系统方案 - 6 - 2.2清洗对象及要求 - 6 - 2.3清洗工…

欧拉路径!

呃在昨晚的破防之下我并不想学这东西所以留到今晚&#xff1f;属于是懒爆了。那么我们来看&#xff0c;定义的话其实前面写过了 其实主要是分两个方面: 1.图是否联通&#xff0c;是什么图 2.这个图每个点的度数或者&#xff08;出度入度&#xff09;什么的若是符合就行。 偷偷总…

【C++】C++基础知识(四)---程序流程结构

C基础知识&#xff08;四&#xff09;1. 顺序结构2. 选择结构2.1 if语句2.2 switch语句2.3 选择结构案例3. 循环结构3.1 循环语句3.2 循环结构案例4. 跳转语句C中支持的三种流程结构&#xff1a;顺序结构、选择结构、循环结构顺序结构&#xff1a;程序按照顺序执行&#xff0c;…