tsumiki

导航

NGINX

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新

1)nginx访问流程

客户端发起请求 先发送到网卡
网卡收到的报文复制到内核空间
内核空间再复制到用户空间的应用程序空间
nginx 分析得到一个磁盘页面文件
再将需求反馈给内核空间,因为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
内核去磁盘上找到所需要的文件,加载到内核空间
加载后再复制到用户空间
用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
整个过程会来回切换 用户空间,内核空间 那么我们可以再次基础上做优化处理
 

2)nginx的进程

Nginx有两个进程:

master process:主进程(守护进程),用来管理工作进程。

worker process:工作进程,用来处理用户的请求。

 

3)nginx 与 apache 的区别

Apache是同步多进程模型,一个连接对应一个进程,而Nginx是异步的,多个连接(万级别)可以对应一个进程。

Nginx轻量级,抗并发,处理静态文件好。

Apache超稳定,对PHP支持比较简单,Nginx需要配合其他后端用,处理动态请求有优势,建议使用前端Nginx抗并发,后端apache集群,配合起来会更好。

Nginx负载均衡、反向代理、处理静态文件优势。

Nginx处理静态请求的速度高于apache,同时并发性比较好,CPU内存占用低,因此可以应对千万级别的网络请求。

 

4)I/O 模型相关概念

同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成

异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

 

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。

非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

 

5)事件驱动模型

Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,

主要有以下实现方式:

1、select: select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部 分参数的含义略有
差异,最大并发限制1024,是最早期的事件驱动模型。
2、poll: 在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编 译nginx的时候可以使
用--with-poll_module和--without-poll_module这两个指定是否编译select 库。
3、epoll: epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和 select和poll有很大的区别,
epoll是poll的升级版,但是与poll有很大的区别. epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮
训检查这个 表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大 数,同时epoll库的I/O
效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行 操作。
 

二.编译安装Nginx

1)将nginx 的安装包放到 opt 目录下,并解压缩

 

2)下载编译环境

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel

 

3)新建nginx用户

 

4)编译模块设置环境

./configure \
--prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

 

5)修改文件权限

conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。

html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。

logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。

sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能

6)创建nginx自启动文件

 

7)systemctl daemon-reload 重新加载配置,并启动服务

 

三.nginx信号的使用

1)信号

nginx 命令支持向其发送信号,实现不同功能

nginx 当做单独命令使用有以下选项

 

如果遇到nginx无法作为命令使用的情况:

 

nginx -s

nginx -s stop 立即关闭nginx

nginx -s quit 优雅退出,不影响业务

nginx -s reload 重新加载

 

nginx -g 指定配置

nginx -g 'user zhangsan;' 已张三身份运行,默认是以nginx身份

nginx -g 'daemon off;' 前台运行命令

 

nginx -t 检查语法

 

nginx分隔日志

1.先将原来的日志文件改名

 2.再创建一个日志文件

 3.去输入命令 nginx -s reopen将日志生成转到新建立的文件中

 

平滑升级

1.下载安装包

 2.解压

 3.编译安装

./configure \
--prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre --with-stream \
--with-stream_ssl_module \
--with-stream_realip_module 

 

4.只make,不要make install

 

5.进入nginx的objs文件夹查看版本号

 

6.将老版本nginx 进行备份

 

7.拷贝objs 中的nginx 到/app/nginx/sbin 中

 

8.输入指令发送升级信号

 

9.优雅关闭老版本的worker进程

 

10.新版本的 pid 号

 

11.去另外一台主机上查看是否更改成功版本

 

四.nginx配置详细解释

主配置文件位置:/usr/local/nginx/conf/nginx.conf

/usr/local/nginx/conf/ 目录下:

nginx.conf 是主配置文件

nginx.conf.default 是主配置文件的备份文件

 

主配置文件中有六个主要模块:

1、全局块:全局配置,对全局生效。

2、events块:配置影响Nginx服务器与用户的网络连接。

3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。

4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。

5、location块:用于配置匹配的url,一个server块中可以有多个location块。

6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

配置文件由指令和指令块构成

每条指令以;分号结尾,指令与值之间以空格符号分隔

pid /apps/run/nginx.pid

指令已{}达括号将多条指令组织在一起且可以嵌套指令块

include语句允许组合多个配置文件以提升可维护性

 

1)全局配置 

nginx多模块

核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能

标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等

可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持

Stream服务模块: 实现反向代理功能,包括TCP协议代理

第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等


隐藏版本或修改版本

 

修改成自己想要的名字

 make && make install

 

修改启动的进程数

 

cpu 与 work 进程绑定

将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。

 

nginx进程优先级

 

调试work进程打开的文件的个数

 

2)event 事件

events {  
worker_connections  65536;
 
 
#设置单个工作进程的最大并发连接数  
use epoll;
#使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置,这个一般默认就写好了,不需要自己写  
 
 
accept_mutex on;  
#on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",
因此nginx刚安装完以后要进行适当的优化。建议设置为on  
 
multi_accept on;  
#ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,
即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on,这个一般是要打开的

 

3)http 设置

http {
... ...  #各server的公共配置
server {    #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器
...
}
server {  
  ... server_name  #虚拟主机名
root     #主目录
alias     #路径别名
location [OPERATOR] URL {     #指定URL的特性
...
if CONDITION {
...
 }
 }
 }
}
 

server块构建虚拟主机

1.先在主配置文件中放入子配置文件
一定要写在http模块里

 2.去到文件夹下创建自己的自配置文件

 3.分别写好配置文件

 4.创建数据文件夹

 5.创建页面

 6.去第二台机器修改 /etc/hosts 文件做测试

 

alias别名

 

location

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri,uri是用户请求的字符串,即域名后面的web文件路径,然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
=              #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~            #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URL的最左边部分做匹配检查,不区分字符大小写
~              #用于标准url前,表示包含正则表达式,并且区分大小写
~*            #用于标准url前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此url的所有的url
#\            #用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

access 模块 四层控制

# 可以去源码包中 过滤 access模块 自带 不想要可以 without 去掉

 

验证模块

1.安装http-tools包,使用htpasswd命令

 2.创建用户和密码

 3.想往文件中再加入文件名的话直接htpasswd -b就行了-c是新建文件夹的意思

 4.去到自己的子配置文件中去设置将文件位置输出出来

location /admin {
            root /opt/html;
            #文件位置
            auth_basic "admin site"
            auth_basic_user_file /data/.httpuser;
           }
5.测试是否设置成功
 

自定义错误界面

 我们 可以改变 默认的错误页面,同时也可以用指定的响应状态码进行响应,

可用位置:http, server, location, if in location

格式:

error_page code ... [=[response]] uri;

页面错误代码

error_page 固定写法

code 响应码

= 可以将响应码转换

uri 访问连接

 

使用我们的子虚拟机添加配置文件
server {
      listen 80;
      server_name www.pc.com;
      root /data/nginx/html/pc;
      error_page 404 /40x.html;
      #当出现404 错误 就去 root /data/nginx/html/pc/error/ 这个文件夹找40x.html 这个文件
      location = /40x.html {
              root /data/nginx/html/pc/error/;
}

 

日志位置存放

可以将自己的子配置文件日志分离

 

检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。

 

在子配置文件中配置

 

长连接

http 基于 tcp 协议 先要 三次握手然后 再传输数据

一次三次握手 下载多个资源

一次三次握手下载一个资源

 

相关设置

keepalive_timeout timeout [header_timeout];
  #设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number;  
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
可以加在全局或者 server

具体操作
直接设置在全局配置里面就行了
keepalive_requests 3;
#最大下载三个资源就会断开
keepalive_timeout 60 65;#只能有一个空格
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,后面的60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60  #浏览器收到的服务器返回的报文
 
#如果设置为0表示关闭会话保持功能,将如下显示:
 

作为下载服务器配置

autoindex on | off;

#自动文件索引功能,默为off
autoindex_exact_size on | off;
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ;
 
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp;
#显示索引的页面文件风格,默认html
limit_rate rate;
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供 限制 变量优先级高
 

用户上传资料

 client_max_body_size 1m;

 #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size;
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名
 
上传文件大于限制 错误代码413
 

其他设置

 
 

posted on 2023-09-04 08:24  Tsumiki  阅读(28)  评论(0编辑  收藏  举报