nginx 简介 第四章
一、Nginx简介
1、Nginx简介
Nginx(特点:占用内存少,并发能力强)
Nginx是一个高性能的 HTTP 和反向代理服务器。
Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件
单台物理服务器可支持30 000~50 000个并发请求。
Tengine
Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网、天猫商城等得到了很好的检验。(可以这样理解:淘宝网拿到了 Nginx 源代码之后,进行了功能的填充、优化等等,然后提交给
Nginx 官方,但是由于 Nginx 官方相应慢甚至不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循 GPL 的原则上进行二次开发,于是就出了现在的 Tengine 这个版本)
注:NG并发连接能力受2个因素影响
1、CPU个数
2、本地物理服务器系统的最大文件数
Apache
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
2、I/O模型相关概念
Nginx服务使用异步非阻塞模式:请求不需要排队,会反馈任务的完成结果。
Apache服务使用同步阻塞模式:请求需要排队,且不会主动返回结果。
同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时。被调用者是否提供完成。
同步:调用者需要主动询问结果。
异步:调用者不需要主动询问结果,被调用者会主动返回结果。
阻塞:系统同时只能处理1个请求,另外的请求需要排队。
非阻塞:系统同时处理多个请求。
3、Nginx事件驱动模型
1、select:一个应用程序,代理系统功能处理异步请求,最大连接数是1024个。
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
2、poll:select加强版取消了1024最大连接数。
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。
3、epoll:poll的加强版。
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。
4、Nginx和Apache的区别
1、Nginx是一个甚于事件的Web服务器; Apache是一个基于流程的服务器
2、Nginx所有请求都由一个线程处理; Apache单个线程处理单个请求
3、Nginx避免子进程的概念; Apache是基于子进程的
4、Nginx在内存消耗和连接方面更好; Apache在内存消耗和连接方面一般
5、Nginx的性能和可伸缩性不依赖于硬件; Apache依赖于CPU和内存等硬件
6、Nginx支持热部署; Apache不支持热部署
7、Nginx对于静态文件处理具有更高的效率;Apache相对一般
8、Nginx在反向代理场景具有明显优势; Apache相对一般
一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache。
二、编译安装Nginx服务
1.关闭防火墙,将安装的Nginx软件包安装到opt目录下
systemctl stop firewalld
systemctl disable firewalld #关闭防火墙
yum -y install pcre-devel zlib-devel gcc gcc-c++ make #安装依赖包
1
2
3
2、编译安装Nginx
cd /opt/
tar zxvf nginx-1.22.2.tar.gz
cd nginx-1.22.0/
1
2
3
./configure \
--prefix=/usr/local/nginx \ #指定Nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启动http_stub_status_module模块,支持状态统计
1
2
3
4
5
make -j2 && make install
1
3、创建用户、组,以便于更好的管理
(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)Nginx服务程序默认以匿名运行
useradd -M -s /sbin/nologin nginx
1
4、创建软连接并启动
#创建软连接,让系统识别Nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#检查文件是否正确
nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#启动nginx
nginx
#查看是否启动nginx
netstat -antulp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5964/nginx: master
#如果遇到占用80端口的情况我们可以先查看pid号
cat /usr/local/nginx/logs/nginx.pid
netstat -antulp | grep nginx
#在用kill -3命令暂停
kill -3 5964
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5、停止Nginx
#首先查看nginx的PID号
cat /usr/local/nginx/logs/nginx.pid
netstat -antulp | grep nginx
#停止nginx
kill -3 5964
netstat -antulp|grep nginx
#这时候就查不到进程号了
6、添加Nginx系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#赋予权限并启动服务
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
#再次查看80端口
lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 6032 root 6u IPv4 35351 0t0 TCP *:http (LISTEN)
nginx 6033 nginx 6u IPv4 35351 0t0 TCP *:http (LISTEN)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
nginx -v #查看nginx版本信息
nginx version: nginx/1.22.0
1
2
7、Nginx配置文件
Nginx主配置文件
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
location块:配置请求的路由,以及各种页面的处理情况。
vim /usr/local/nginx/conf/nginx.conf #nginx.conf是主配置文件
1
nginx.conf详解
worker_processes 1;
#全局配置本机可运行多少个master进程,根据本机cpu数量设置数量,可设置为auto按cpu核数自动化调整
events {
#events事件处理模块
worker_connections 1024;
#每个worker子进程可以处理多少个请求即可以打开多少个文件
}
http {
#http模块,web服务器与网页有关配置写在此模块中
include mime.types;
#mime.type中规定了那些文件是给用户查看的,若文件类型不在此文件中则是下载文件。
default_type application/octet-stream;
#默认支持文件类型
sendfile on;
#开启文件传输
keepalive_timeout 65;
#长连接超时时间,单位为秒
server {
#http模块中的server模块,主要配置监听端口,虚拟主机,dns域名等
listen 80;
#监听所有ip的80端口
server_name localhost;
#主机名为本机,可虚拟域名
location / {
#http模块下的location模块
root html;
#此location的根目录位置
index index.html index.htm;
#配置默认寻找文件,先寻找index.html若无此文件则找index.htm
}
error_page 500 502 503 504 /50x.html;
#500、502等错误界面跳转访问指定的/下的50x.html页面
location = /50x.html {
#定义此location为精确匹配,必须是50x.html才能访问此页面
root html;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@localhost conf]# mkdir -p /var/www/{abc,123}
[root@localhost conf]# cd /var/www/
[root@localhost www]# ls
123 abc
[root@localhost www]# echo 'this is 123 test web!' > 123/index.html
[root@localhost www]# echo 'this is abc test web!' > abc/index.html
1
2
3
4
5
6
7
vim /usr/local/nginx/conf/nginx.conf
#增加location模块
location /abc {
root /var/www;
index index.html;
}
location /123 {
root /var/www;
index index.html;
}
1
2
3
4
5
6
7
8
9
10
11
systemctl reload nginx #改完重新读取 nginx.conf 主配置
1
8、打开浏览器测试
四、访问状态统计配置
修改 nginx.conf 配置文件,指定访问位置并添加 stub_status配置
#先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的Nginx是否包含HTTP_STUB_STATUS模块
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
1
2
3
4
5
cat /opt/nginx-1.22.0/auto/options | grep YES #可查看 nginx 已安装的所有模块
1
vim /usr/local/nginx/conf/nginx.conf
#添加STUB_STATUS模块
location /state { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
1
2
3
4
5
6
写一个监控并发数的脚本
#!/bin/bash
while true
do
count=$(curl -Ls 192.168.154.10/state | grep 'Active connections' | awk '{print $3}')
if [ $count -ge 1 ];then
echo '警告当前并发负载过高,并发数为:$count '
fi
sleep 2 #每两秒警告一次
done
1
2
3
4
5
6
7
8
9
10
五、基于授权的访问控制
[root@localhost ~]# yum install -y httpd-tools
1
#生成用户密码认证文件
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db zhangsan
New password: #密码123456
Re-type new password: #确认密码123456
Adding password for user zhangsan
1
2
3
4
5
[root@localhost ~]# cd /usr/local/nginx/
[root@localhost nginx]# cat passwd.db
[root@localhost nginx]# htpasswd ./passwd.db lisi
[root@localhost nginx]# cat passwd.db
[root@localhost nginx]# pwd
1
2
3
4
5
#降低权限
[root@localhost nginx]# chown nginx passwd.db
[root@localhost nginx]# chmod 400 passwd.db
1
2
3
vim /usr/local/nginx/conf/nginx.conf #更改配置文件
location /abc {
root /var/www;
index index.html;
auth_basic "Hello sir";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
1
2
3
4
5
6
7
8
[root@localhost nginx]# nginx -t #检查语法格式
[root@localhost nginx]# systemctl restart nginx
1
2
六、基于客户端的访问控制
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
1
location /state {
stub_status on;
access_log off;
allow 127.0.0.1; #允许本机访问
allow 192.168.154.11; #允许192.168.154.11的主机访问
deny all; #禁止其它主机访问
}
1
2
3
4
5
6
7
systemctl restart nginx
1
使用IP地址为 192.168.154.11 的虚拟机测试成功
使用IP地址为 192.168.154.12 的虚拟机测试失败,403被加入黑名单
七、基于域名的Nginx虚拟主机
为虚拟主机准备网页文档
修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
1
server {
listen 80;
server_name www.accp.com;
charset utf-8;
access_log logs/accp.com-access.log;
location / {
root /var/www/abc;
index index.html index.htm;
}
1
2
3
4
5
6
7
8
9
10
11
12
:35,55 co 80 #复制完修改后在末尾加个大括号
在Windows 系统测试
在Linux 系统下测试
八、基于IP地址的Nginx 虚拟主机
vim /usr/local/nginx/conf/nginx.conf #修改配置文件
1
九、基于端口的Nginx 虚拟主机
vim /usr/local/nginx/conf/nginx.conf #修改配置文件
1
SSH 日志检查(secure)
cd /var/log/
vim secure #ssh的连接信息
1
2
————————————————
版权声明:本文为CSDN博主「橘淮南枳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ll945608651/article/details/130135480
相关文章:
nginx 简介 第四章
一、Nginx简介 1、Nginx简介 Nginx(特点:占用内存少,并发能力强) Nginx是一个高性能的 HTTP 和反向代理服务器。 Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件 单台物理服务器可支持30 000~50 000个并发…...
c++ float32 与 float16 互转
背景: 最近用到一块推理加速卡时,推理输入的数据是 float16 类型,而我们平常用到的数据是 float 类型,也就是 float32类型,这需要输入数据时float32 转 float16,解析输出数据时 float16 转 float。 参考&…...
Redis问题
一、认识Redis 1. 什么是 Redis? Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景&#…...
[API]ListList方法集合排序Lambda表达式(四)
List接口: 继承自Collection接口,List集合是可重复集合,并且有序,还提供了一套可以通过下标来操作元素的方法 常见的实现类: ArrayList:内部使用数组实现,查询性能更好(直接下标找到物理地址)、…...
【ChatGPT】无需魔法打开即用的 AI 工具集锦
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...
Choco-slover的使用
一. 相关资料 choco-slover github源代码以及工具下载网址:https://github.com/chocoteam/choco-solverchoco-slover 官网文档:https://choco-solver.org/choco-slover安装eclipse视频:https://www.youtube.com/watch?v=qz6ATkEI_F8视频所采用的资源网址:https://drive.go…...
亚马逊、ebay、temu如何提升产品点击率?测评自养号解析
产品点击率对于店铺销售额的影响至关重要,尤其是在竞争越来越激烈的市场环境中,想要有销量和转化,提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时,第一眼看到的就是主图,一张优质的主图更容…...
人工智能的前沿信息获取之使用谷歌学术搜索
谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4],谷歌学术的网址为https://scholar.google.com,界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字,然后点搜索按钮即可,…...
PHP快速入门06-类型转换
文章目录 前言一、关于类型转换1.1 自动类型转换1.2 显式类型转换 二、15个常用类型转化示例2.1 将字符串转换为整型2.2 将整型转换为字符串2.3 将浮点型转换为整型2.4 将整型转换为浮点型2.5 将布尔型转换为整型2.6 将整型转换为布尔型2.7 将字符串转换为浮点型2.8 将浮点型转…...
Motion Planning学习笔记一:配置空间、图、图搜索、图遍历
学习高飞博士的路径规划课程所总结的学习笔记。 目录 1、配置空间(Configuration Space, C-space) 2、图(Graphs) 3、图搜索(Graph Search Basis) 3.1、总体框架 3.2、两种基本的图遍历算法 3.3、启…...
C语言中如何判断大小端字节序?
大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…...
用spring-boot-starter实现事务的统一配置
一、前言 微服务架构下,多个微服务都需要事务操作,如果在每个微服务下都从头配置事务,将非常繁锁。事务配置具有高度的一致性,可以抽取出来,制作starter,在需要配置事务的服务中引入starter依赖即可。 采用…...
C语言中fopen的详细用法
fopen是C语言中用于打开文件的函数,其原型为: FILE *fopen(const char *filename, const char *mode); 其中,filename是要打开的文件名,mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针,该指针指向打开的…...
C语言——学生信息管理系统(数组)
文章目录 一、前言二、目的三、框架1.菜单1.1主菜单1.2子菜单 2.流程图2.1总流程图2.2开始流程图2.3增加学生信息流程图2.4.删除学生信息流程图2.5修改学生信息流程图2.6查询学生信息流程图2.7对学生信息排序流程图 3.思路 四、代码五、演示视频 一、前言 因为最近是在赶进度总…...
【C语言】基础语法1:变量和数据类型
下一篇:运算符和表达式 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…...
linux安装和使用jekins
Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面:https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…...
驼峰式匹配
问题: 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。) 给定待查询列表 queries,和模式串 patte…...
第三十七章 立方体贴图总结
立方体贴图:将多个纹理组合起来映射到一张纹理上的一种纹理类型。 一个立方体贴图时包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面,相当于是一个有纹理的立方体。 创建立方体贴图: 首先需要生成一个纹理,将其绑定到纹理目标上,再做其他纹理操作。补充:绑定到…...
哈希(C++)
哈希 unordered系列关联式容器unordered_map介绍 底层结构哈希概念哈希冲突哈希函数哈希冲突解决方式闭散列开散列 模拟实现哈希表的改造 哈希应用位图概念实现 布隆过滤器提出概念 unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器&…...
Spring MVC 的调用(12)
目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
