Nginx介绍与安装

目录

nginx服务

1、Nginx 介绍

2、为什么选择 nginx

3、IO多路复用

1、I/O multiplexing【多并发】

2、一个请求到来了,nginx使用epoll接收请求的过程是怎样的?

3、异步,非阻塞

4、nginx 的内部技术架构

5、yum安装部署nginx和配置管理

1.获取nginx的yum源

2.安装nginx

3.启动nginx

4.检查是否启动

5.设置开机启动

6.通过 nginx 命令控制 nginx 服务

6.源码编译安装nginx

1.获取nginx源码包

2.安装编译用的依赖包

3.创建nginx用户

4.解压源码包

5.编译

6.安装

7.启动nginx

8.检查是否启动

9.用systemctl服务控制nginx

10.以 systemctl 方式启动 Nginx

11.配置 Nginx 服务自动启动

7.nginx 日志文件详解

​编辑

8.nginx 高级应用

1.使用alias实现虚拟目录;

2、通过 stub_status 模块监控 nginx 的工作状态

3、使用 limit_rate 限制客户端传输数据的速度


nginx服务

1、Nginx 介绍

 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务。
 nginx因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好

2、为什么选择 nginx

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

单机环境下参考服务器配置。 并发连接数在7000+ -8000左右。 集群模式20000+

作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

3、IO多路复用

1、I/O multiplexing【多并发】

第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)

1561897144109

第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)

I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流。发明它的原因,是尽量多的提高服务器的吞吐能力。

在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流

1561897166658

2、一个请求到来了,nginx使用epoll接收请求的过程是怎样的?

ngnix会有很多连接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相

应的代码处理。

  • select, poll, epoll 都是I/O多路复用的具体的实现,其实是他们出现是有先后顺序的。

I/O多路复用这个概念被提出来以后, 相继出现了多个方案

  • select是第一个实现 (1983 左右在BSD里面实现的)。

select 被实现以后,很快就暴露出了很多问题。

• select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。

• select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...

• select 只能监视1024个链接。

• select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收

回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的

  • 于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如

• poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。

• poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。

其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。

但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。

你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。

  • 于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll.

epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:

• epoll 现在是线程安全的。

• epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

3、异步,非阻塞
 $ pstree |grep nginx
  |-+= 81666 root nginx: master process nginx
  | |--- 82500 nobody nginx: worker process
  | \--- 82501 nobody nginx: worker process

1个master进程,2个work进程

 每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。

4、nginx 的内部技术架构

Nginx服务器,以其处理网络请求的高并发、高性能及高效率,获得了行业界的广泛认可,近年已稳居web服务器部署排名第二的位置,并被广泛用于反向代理和负载均衡。

Nginx是如何实现这些目标的呢?答案就是其独特的内部技术架构设计。看懂下面这张图,就明白了Nginx的内部技术架构。

1561897235155

简要说明几点:

1)nginx启动时,会生成两种类型的进程,一个是主进程(Master),一个(windows版本的目前只有一个)或多个工作进程(Worker)。主进程并不处理网络请求,主要负责调度工作进程,也就是图示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。

2)服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求

3)模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

4)事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及event ports。

5)代理(proxy)设计,可以说是nginx深入骨髓的设计,无论是对于HTTP,还是对于FastCGI、memcache、Redis等的网络请求或响应,本质上都采用了代理机制。所以,nginx天生就是高性能的代理服务器

5、yum安装部署nginx和配置管理

访问nginx的官方网站:nginx news

Nginx版本类型

Mainline version: 主线版,即开发版

Stable version: 最新稳定版,生产环境上建议使用的版本

Legacy versions: 遗留的老版本的稳定版

1561531095060

Yum安装nginx

配置Yum源的官网:nginx: Linux packages

关闭防火墙和selinux:

 [root@nginx-server ~]# getenforce 
 Enforcing
 ​
 [root@nginx-server ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
 ​
 [root@nginx-server ~]# systemctl stop firewalld
 [root@nginx-server ~]# systemctl disable firewalld
1.获取nginx的yum源

2.安装nginx
 [root@nginx-server ~]#yum -y install nginx
3.启动nginx
 [root@nginx-server ~]#systemctl start nginx
4.检查是否启动
 [root@nginx-server ~]#ss -nplt | grep nginx
5.设置开机启动
 [root@nginx-server ~]# systemctl enable nginx 
6.通过 nginx 命令控制 nginx 服务
 nginx -c /path/nginx.conf        # 以特定目录下的配置文件启动nginx:
 nginx -s reload                  # 修改配置后重新加载生效
 nginx -s reopen                  # 重新打开日志文件
 nginx -s stop                    # 快速停止nginx
 nginx -s quit                    # 完整有序的停止nginx
 nginx -t                         # 测试当前配置文件是否正确
 nginx -t -c /path/to/nginx.conf  # 测试特定的nginx配置文件是否正确
 ​
 注意:
 nginx -s reload 命令加载修改后的配置文件,命令下达后发生如下事件
 1. Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原配置文件进行工作(因为worker未受到影响)
 2. Nginx启动新的worker进程,采用新的配置文件
 3. Nginx将新的请求分配新的worker进程
 4. Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程
 5. 重复上面过程,直到全部旧的worker进程都被关闭掉

6.源码编译安装nginx

1.获取nginx源码包

2.安装编译用的依赖包
 [root@localhost ~]#yum -y install gcc gcc-c++ make zlib-devel pcre pcre-devel openssl-devel perl-devel perl-ExtUtils-Embed gd-devel
3.创建nginx用户
 [root@localhost ~]#useradd -s /sbin/nologin -M nginx
4.解压源码包
 [root@localhost ~]#tar zxvf nginx-1.25.3.tar.gz -C /usr/local/
5.编译
 [root@localhost ~]#cd /usr/local/nginx-1.25.3/
 [root@localhost nginx-1.25.3] ./configure \
 --user=nginx \
 --group=nginx \
 --prefix=/usr/local/nginx \
 --conf-path=/etc/nginx/nginx.conf \
 --sbin-path=/usr/sbin/nginx \
 --error-log-path=/var/log/nginx/nginx_error.log \
 --http-log-path=/var/log/nginx/nginx_access.log \
 --pid-path=/usr/local/nginx/run/nginx.pid
6.安装
 [root@localhost nginx-1.25.3]# make  && make install
7.启动nginx
 [root@localhost nginx-1.25.3]# systemctl start nginx
8.检查是否启动
 [root@localhost nginx-1.25.3]# ss -nplt | grep nginx
9.用systemctl服务控制nginx
 #创建 nginx.service 文件
 [root@localhost ~]#vim /lib/systemd/system/nginx.service
 [Unit]
 Description=nginx
 After=network.target
 ​
 [Service]
 Type=forking
 ExecStart=/usr/sbin/nginx
 ExecReload=/usr/sbin/nginx -s reload
 ExecStop=/usr/sbin/nginx -s quit
 PrivateTmp=true
 ​
 [Install]
 WantedBy=multi-user.target
10.以 systemctl 方式启动 Nginx
 [root@localhost ~]# pkill nginx
 [root@localhost ~]# systemctl daemon-reload 
 [root@localhost ~]# systemctl start nginx
11.配置 Nginx 服务自动启动
 [root@localhost ~]# systemctl enable nginx

7.nginx 日志文件详解

 nginx 日志文件分为 **log_format** 和 **access_log** 两部分
 ​
 log_format 定义记录的格式,其语法格式为
 ​
 log_format        样式名称        样式详情
 ​
 配置文件中默认有
 log_format  main  'remote_addr - remote_user [time_local] "request" '
                   'status body_bytes_sent "$http_referer" '
                   '"http_user_agent" "http_x_forwarded_for"';

8.nginx 高级应用

1.使用alias实现虚拟目录;
 location /test {
             alias   /var/www/qianfeng/;
             index  index.html; 
         }
         
 location /test {
             root   /var/www/qianfeng/;
             index  index.html; 
         }
2、通过 stub_status 模块监控 nginx 的工作状态

1)、通过 nginx -V 命令查看是否已安装 stub_status 模块

2)、编辑 /etc/nginx/nginx.conf 配置文件

 #添加以下内容~~ 
 location /nginx-status { 
       stub_status on; 
       access_log    /var/log/nginx/nginxstatus.log;    #设置日志文件的位置 
       auth_basic    "nginx-status";    #指定认证机制(与location后面的内容相同即可) 
       auth_basic_user_file    /etc/nginx/htpasswd;     #指定认证的密码文件 
       }

3).创建认证口令文件并添加用户qianfeng和zdgg,密码用md5加密

 [root@localhost ~]# yum install -y httpd-tools  #htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,用于生成 http 基本认证的密码文件
 htpasswd -c -m /etc/nginx/htpasswd qianfeng             # -c 创建解密文件,-m MD5加密
 htpasswd -m /etc/nginx/htpasswd zsgg

4)、重启服务

5)、客户端访问 http://ip/nginx-status 即可

 Active connections: 2 
 server accepts handled requests
  27 27 40 
 Reading: 0 Writing: 1 Waiting: 1
 ​
 Active connections – 活跃的连接数量
 server accepts handled requests — 总共处理了27个连接 , 成功创建27次握手, 总共处理了40个请求。
 reading — 读取客户端的连接数。
 writing — 响应数据到客户端的数量。
 waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

3、使用 limit_rate 限制客户端传输数据的速度

1、编辑/etc/nginx/nginx.conf

 location / {
             root   /var/www/nginx/; 
             index  index.html index.htm;
             limit_rate  2k;  #对每个连接的限速为2k/s
         }

重启服务

注意要点:

  • 配置文件中的每个语句要以 ; 结尾

  • 使用 htpasswd 命令需要先安装 httpd-tools

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

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

相关文章

压测必经之路,Jmeter分布式压测教程

01、分布式压测原理 Jemter分布式压测是选择其中一台作为调度机(master),其他机器作为执行机(slave);当然一台机器也可以既做调度机,也做执行机。 调度机执行脚本的时候,master将会…

C++ 多态以及多态的原理

文章目录 多态的概念多态的构成条件虚函数的重写虚函数重写的两个例外 重载、重写(覆盖)、重定义(隐藏)对比C11 final 和 override关键字抽象类接口继承和普通继承多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表 多态的概念 …

C#实现个人账本管理系统

git地址:https://gitee.com/myshort-term/personal-ledger-management-system 1.系统简介 LedgerManagementSystem是一个小型的个人账本管理系统,可对收支项目进行增加、删除、修改、查询以及导入和导出。可对每日的各类收支项目进行汇总并查看和修改收…

vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots

文章目录 前言一、defineProps二、defineEmits三、defineExpose四、defineOptions( Vue3.3 新特性)五、defineSlots(Vue3.3 新特性) 前言 本章我们来讲解vue3 ts 中 defineProps、defineEmits、defineExpose、defineOptions、defineSlots的使用及作用。 …

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具,用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体,能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

C++ vector模拟实现

C vector模拟实现 一.我们要实现的大致框架1.STL库中是如何实现的呢?1.迭代器2.成员变量3.vector的特性4.vector的成员变量大致情况 2.我们要实现的大致框架3.前言 二.具体实现1.迭代器,begin,end2.无参构造,析构,简单函数3.push_back4.reserve1.reserve的第一大坑点:野指针问…

React Native 桥接原生常量

一、编写并注册原生常量方法 在 SmallDaysAppModule 这个模块中有一个方法 getConstans ,重载这个方法就可将自定义的常量返回,系统会自行调用该方法并返回定义的常量将其直接注入到 JS 层,在 JS 层直接获取即可。 二、JS 层获取原生常量&am…

电脑USB接口不同颜色的含义

当你看到笔记本电脑或台式机的USB端口时,你会发现USB端口的颜色很多;这些颜色可不只是为了好看,实际上不同颜色代表着不同的性能,那么这些带颜色的USB端口都是什么含义呢,下面就具体介绍下不同颜色代表的含义。-----吴…

钉钉逐浪AI Agent

文|郝 鑫 编|刘雨琦 “大公司代表落后生产力,是慢半拍的”,“小创新靠大厂,大创新仍然要靠小厂”,这是以李彦宏和王小川为代表的创业老炮,在2023年总结出来的创新规律,从移动互…

单片机原理及应用:中断嵌套

​中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序…

阿里云的通义千问VS百度的文心一言~~

最近人工智能热度迅速升温,我体验了一下各大厂商的大模型的能力,发现他们确实很智能! 我想问一下“南方小土豆”这个梗是如何火起来的,结果如下: 文心一言: 回答的比较准确,但有一些过于“官方”…

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模进阶应用

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

vue知识-03

购物车案例 要实现的功能&#xff1a; 1、计算商品总价格 2、全选框和取消全选框 3、商品数量的增加和减少 <body> <div id"app"><div class"row"><div class"col-md-6 col-md-offset-3"><h1 class"text-center…

SpringCloudAlibaba微服务架构实战派上下册技术交流!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

Springboot药物不良反应智能监测系统源码

一、系统简介 ADR指的是药品不良反应&#xff0c;即在合格药品在正常用法用量下&#xff0c;出现与用药目的无关或意外的有害反应。ADR数据辨别引擎、药品ADR信号主动监测引擎、ADR处置行为分析引擎。ADR数据辨别引擎&#xff0c;通过主动监测患者具象临床指标&#xff0c;比如…

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中&#xff0c;我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在&#xff0c;让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

腾讯云优惠券介绍、领取方法及使用教程

腾讯云作为国内领先的云服务提供商&#xff0c;为了吸引更多的用户使用其产品&#xff0c;经常会推出各种优惠券活动。本文将详细介绍腾讯云的优惠券、领取方法和使用教程。 一、腾讯云优惠券介绍 腾讯云优惠券是腾讯云为了吸引用户使用其产品而推出的促销活动。用户可以通过领…

软件测试工程师,从6K到25k的测试之路养成,一路狂飙...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、技术方向 就技…

静态网页设计——滑板官网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1Cw411u7hj/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

基于传统机器学习的项目开发过程——@挑大梁

1 场景分析 1.1 项目背景 描述开发项目模型的一系列情境和因素&#xff0c;包括问题、需求、机会、市场环境、竞争情况等 1.2. 解决问题 传统机器学习在解决实际问题中主要分为两类&#xff1a; 有监督学习&#xff1a;已知输入、输出之间的关系而进行的学习&#xff0c;从而…