nginx 简介 第四章

news/2024/4/24 22:53:36/

一、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


http://www.ppmy.cn/news/47039.html

相关文章

当,Kotlin Flow与Channel相逢

Flow之所以用起来香,Flow便捷的操作符功不可没,而想要熟练使用更复杂的操作符,那么需要厘清Flow和Channel的关系。 本篇文章构成: 1. Flow与Channel 对比 1.1 Flow核心原理与使用场景 原理 先看最简单的Demo: fun…

WMS智能仓储

子产品介绍篇--智能仓储 智能仓储 我们通常也称 WMS 系统。是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息、资源、行为、存货和分销运作进行更完美地管理,提高效率。 一. 仓储管理系统(wms)…

柔性数组【结构体和动态内存的结合】

全文目录 前言柔性数组的定义语法柔性数组的特点柔性数组的使用柔性数组的优势 前言 很多人可能没有听过柔性数组这个概念,但是在C99中柔性数组是确实存在的。我个人感觉有点像动态内存和结构体的结合。 柔性数组的定义语法 结构中的最后一个元素允许是未知大小的…

IO多路复用 学习笔记 (阻塞 IO,非阻塞IO,select 模型,poll 模型,epoll 模型)

参考了一下网络资源做的笔记 什么是IO多路复用 就是用一个线程或者一个进程监控文件描述符是否能执行 IO操作 传统网络IO - 阻塞 IO (BIO) 阻塞IO就是当我们执行一次IO操作中,整个程序是阻塞的,意味在途中我们必须等待返回才…

你了解C语言中的数组指针和函数指针吗?

如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。 数组指针 数组指针,即指向数组的指针,是用来存放数组的地址的。那如…

车载网络 - Autosar网络管理 - 跳转状态

四、Autosar网络管理跳转状态 网络模式对应报文状态 Autosar网络管理报文各个状态对应的网络管理报文和应用报文的发送和接收状态。 网络模式 网络管理报文 应用报文 收发类型 发送报文 接收报文 发送报文 接收报文 总线睡眠模式(BSM) No Yes No NA 准备总线睡眠模…

第14届蓝桥杯 | 冶炼金属

作者:指针不指南吗 专栏:第14届蓝桥杯真题 🐾慢慢来,慢慢来🐾 文章目录 题目代码摸索第一次 AC 5/10第二次 AC 100% 反思 题目 链接: 4956. 冶炼金属 - AcWing题库 小蓝有一个神奇的炉子用于将普通金属 O …

老宋 带你五分钟搞懂vue

Vue 1.1 什么是框架 任何编程语言在最初的时候都是没有框架的,后来随着在实际开发过程中不断总结『经验』,积累『最佳实践』,慢慢的人们发现很多『特定场景』下的『特定问题』总是可以『套用固定解决方案』。于是有人把成熟的『固定解决方案…

javascript之函数

什么是函数? (函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。) 是封装了一段可以重复调用执行的代码,通过找个代码块,能够实现大量代码的重复使用 使用函数的方式: 声明函数调用函数 声…

使用vscode+cmake进行c++代码编写

1. 前言 因为vcode的主题格式比visual studio好看,而且注释使用ctr/注释非常方便。所以对于一下小型的c代码测试,例如用不到外部库,只需要纯c自己语法,我就想和python一样,在vscode上写。因此记录一下比较简单的典型的…

C++算法初级10——动态规划

C算法初级10——动态规划 文章目录 C算法初级10——动态规划最优化问题动态规划分析流程和条件 最优化问题 生活中我们常常遇到这样一些问题: 看到上面的例子,我们发现这些问题都是在最大化(或者最小化)某个指标:最小…

剪枝与重参第七课:YOLOv8剪枝

目录 YOLOv8剪枝前言1.Overview2.Pretrain(option)3.Constrained Training4.Prune4.1 检查BN层的bias4.2 设置阈值和剪枝率4.3 最小剪枝Conv单元的TopConv4.4 最小剪枝Conv单元的BottomConv4.5 Seq剪枝4.6 Detect-FPN剪枝4.7 完整示例代码 5.YOLOv8剪枝总结总结 YOLOv8剪枝 前…

你真的会用iPad吗,如何使iPad秒变生产力工具?在iPad上用vscode写代码搞开发

目录 前言 视频教程 1. 本地环境配置 2. 内网穿透 2.1 安装cpolar内网穿透(支持一键自动安装脚本) 2.2 创建HTTP隧道 3. 测试远程访问 4. 配置固定二级子域名 4.1 保留二级子域名 4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问 6. iPad通过软件远程vscode…

Java的时代依然还在,合格的Java工程师成为紧缺人才

Java的时代依然还在,合格的Java工程师成为紧缺人才 编程语言的世界变化莫测,在其中浮浮沉沉28年的Java,也经历见证了很多语言的兴起和衰败。在最新的编程语言排行榜中,Java依旧位居前三,可见Java的发展后劲有多强&…

C++linux高并发服务器项目实践 day3

Clinux高并发服务器项目实践 day3 文件IO标准C库IO函数与LinuxIO函数虚拟地址空间文件描述符Linux系统IO函数open与close mode:八进制的数,表示用户对创建出的新的文件的操作权限 最终的权限是:mode & ~umask 0777 r(读) w(写) x(可执行)都有这样的权…

Linux 的 grep 命令使用大全

当你需要在Linux或Unix系统中快速搜索文件中的特定字符串时,grep命令是非常有用的工具。Grep是Global Regular Expression Print的缩写,它是一个文本搜索工具,可以用来在一个或多个文件中查找文本模式。在这篇博客中,我将会讲解gr…

FPGA基于SFP光口实现1G千兆网UDP通信 1G/2.5G Ethernet PCS/PMA or SGMII替代网络PHY芯片 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利:工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下: 1:verilog编写的udp收发器,但不带ping功能,这样的代…

Spark 实现重新分区 partitionBy、coalesce、repartition(附代码演示)

文章目录 1、partitionBy 源码中的定义(部分) 调用方式 2、coalesce 源码中的定义 调用方式 3、repartition 源码中的定义 调用方式 repartition和coalesce的区别 代码演示 (跳转代码) 实现重新分区,本质上…

C++ [图论算法详解] 欧拉路欧拉回路

蒟蒻还在上课,所以文章更新的实在慢了点 那今天就来写一篇这周刚学的欧拉路和欧拉回路吧 讲故事环节: 在 一个风雪交加的夜晚 18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系…

linux知识

1.vi 删除-dd i-insert 最后一行-G 第一行-g 查找-/ 替换-:s/old/new/g 2.wc -》 行数 字符数 字节数 -w 统计字数 3. sort -k 按某一列排序 -r reverse -n 按字符排 4.uniq -c 统计重复数量 5.head -4 取文件前4行 6.date --date"1 days ago" date "%Y%m%D %H…