Nginx基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx基础相关的知识,希望对你有一定的参考价值。

I/O模型:

一次I/O经过两个阶段:
第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短

磁盘文件 -----> 内核空间 ----->用户空间

I/O模型:
同步/异步:关注的是消息通信机制 
同步:synchronous,调用者等待被调用者返回消息,才能继续执行
异步:asynchronous,被调用者通过状态,通知或回调机制主动通知调用者被调用者的运行状态 

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成
最终的调用结果返回之前,调用者不会被挂起

5种I/O模型:

同步阻塞:
进程发起调用后,第一阶段数据从磁盘空间到内存空间的过程是阻塞的,进程会被挂起
第二阶段,数据从内存空间进入进程内存空间时,也是阻塞的!整个过程一个进程只能响应一个请求

同步非阻塞:
进程发起调用后,第一阶段数据从磁盘空间到内存空间的过程中进程不用阻塞,但确需要不断向被调用者询问
调用是否完成,第二阶段数据从内核内存空间到进程空间内存的时候,进程依然会阻塞

I/O复用:
进程发起调用后,会利用select函数进行监控,此时select[epoll]系统调用会阻塞等待调用完成[磁盘---内核内存]
从而解放了进程,进程可以继续响应别的用户请求,
当第一节阶段完成后,select调用结束,进程会最等待数据进入进程内存
nginx因为使用epoll这种系统调用做为底层的实现方式,当第一阶段进程发起系统调用后,会阻塞在epoll调用中
而进程可以去响应其它的用户请求,当调用结束时,epoll会触发信号通知进程返回来等待数据进入进程空间!此外
epoll支持的并发访问基本不受限制,所以Nginx可以支持更好的并发

事件驱动:
进程发起调用后,第一阶段数据从磁盘空间到内存空间的过程中进程不用阻塞,当数进入内核内存空间时,
内核会触发一个信号通知进程回来等待数据进入进程空间!

异步非阻塞--异步I/O:
进程发起调用后,两个阶段都不需要阻塞,直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续操作了

Nginx特性简介:

特性:
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven[事件驱动],aio[异步I/O],mmap[内存映射],sendfile 

基本功能:
静态资源的web服务器
http协议反向代理服务器
pop3/imap4协议反向代理服务器
FastCGI(LNMP),uWSGI(python)等协议
模块化(非DSO)-如zip,SSL模

报文响应码:

     1XX:信息性状态码()
      100:请求继续 101:转换协议
     2XX:成功状态码
      200:OK 请求没问题,资源存在!201:服务器接收并且保存

     3XX:重定向状态码
       301:永久重定向,在响应报文中使用首部“localtion:URL值”,指定资源现在所处的位置
       302:临时重定向在响应报文中使用首部“localtion:URL值”指定临时资源位置
       304:没修改这个资源可以使用缓存,条件式请求中使用
     4XX:客户端错误
       401:认证
       403:拒绝访问,请求被服务器拒绝
       404:NOT Found,服务器无法找到请求的URL
       405:不允许使用此方法请求相应的URL

     5XX:服务器类的错误
       500:服务器内部错误:
       502:代理服务器从上游收到了一条伪相应
       503:服务器此时无法提供服务,但将来可能可可用

Nginx安装:

epel源中有Nginx安装包

Nginx启动方式:
方式1:
Nginx:默认为启动nginx  
-h 查看帮助选项  
-V 查看版本和配置选项  
-t 测试nginx语法错误
-T 检测nginx语法并输出配置文件信息
-q 检测过程中只显示错误信息  
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)  
-s signal 发送信号给master进程,
signal:stop, quit, reopen, reload
示例: nginx -s stop  停止nginx
nginx -s reload  加载配置文件  
-g directives 在命令行中指明全局指令 

使用nginx启动后,不支持systemctl控制

方式2:
centos7 --->systemctl start nginx
centos6 --->service nginx start

主配置文件介绍:

主配置文件:
/etc/nginx/nginx.conf

简要说明:
1 所有配置要以";"结尾
2 支持使用配置变量  
内建变量:由Nginx模块引入,可直接引用  
自定义变量:由用户使用set命令定义         
set variable_name value;  
引用变量:$variable_name

主配置文件分块:
main block {
    主配置段
}

http {
    http块
}

mail {
    邮件模块
}

stream {
    stream模块
}

Nginx编译安装:

创建用户和组:
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin nginx

准备开发环境:
    首先配置yum源然后安装:
        yum groupinstall Development tools
        yum groupinstall "Server Platform Development"
        yum install pcre-devel
        yum install openssl-devel
        yum install zlib[devel]

准备nginx源码包组,解压及编译:
    tar xf nginx-1.14.0.tar.gz
    cd nginx-1.14.0
./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre

make && make install 

创建目录:
mkdir /var/tmp/nginx
根据你自己指定的文件存放目录来创建!

准备语法高亮:
1 再家目录下创建 mkdir .vim/syntax
2 再网上或者官网上找一个 nginx.vim文件,放在这个目录中
3 然后cd到父目录中,创建一个  filetype.vim文件
au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == ‘‘ |  setfiletype nginx | endif 

4 配置nginx脚本文件,因为文字太多这里就不附送脚本文件内容
1 vim /etc/rc.d/init.d/nginx
把脚本文件复制进去
2 chmod +x nginx
3 chkconfig --add nginx
4 service nginx start

启动Nginx并测试使用!

编译选项解析:
--prefix=/etc/nginx 安装路径
--sbin-path=/usr/sbin/nginx 指明nginx程序文件安装路径
--conf-path=/etc/nginx/nginx.conf 主配置文件安装位置
--error-log-path=/var/log/nginx/error.log 错误日志文件安装位置
--http-log-path=/var/log/nginx/access.log 访问日志文件安装位置
--pid-path=/var/run/nginx.pid 指明pid文件安装位置
--lock-path=/var/run/nginx.lock 锁文件安装位置
--http-client-body-temp-path=/var/cache/nginx/client_temp
客户端body部分的临时文件存放路径,服务器允许客户端使用put方法提交大数据时
临时存放的磁盘路径
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 作为代理服务器,服务器响应报文的临时文件存放路径 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 作为fastcgi代理服务器,服务器响应报文的临时文件存放路径 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 作为uwsgi代理服务器,服务器响应报文的临时文件存放路径 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 作为scgi反代服务器,服务 器响应报文的临时文件存放路径 
--user=nginx 指明以那个身份运行worker进程,主控master进程一般由root运行 
--group=nginx 
--with-http_ssl_module 表示把指定模块编译进
--with-http_v2_module --支持http2.0版本
--with-file-aio --异步ai
--with-threads  ---支持线程
--with-http_dav_module 
--withhttp_stub_status_module

编译时如何更改nginx名称和版本:
1 更改版本和名称:
编辑源码包目录下:
nginx-1.14.0/src/core/nginx.h
更改版本:
#define NGINX_VERSION      "10.6.10"
更改nginx名称:
#define NGINX_VER          "test/" NGINX_VERSION

2 设置不在相应报文中显示真正的server
编辑源码包目录下:
/nginx-1.14.0/src/http/ngx_http_header_filter_module.c 
更改项:
 static u_char ngx_http_server_string[] = "Server: testnginx" CRLF; 

 编译成功后测试访问:
 [[email protected]:26:02yum.repos.d]#curl -I 192.168.23.48
HTTP/1.1 200 OK
Server: test/10.6.10 -->server已经自定义
Date: Sat, 10 Nov 2018 14:55:48 GMT
Content-Type: text/html
Content-Length: 20
Last-Modified: Sat, 10 Nov 2018 14:55:24 GMT
Connection: keep-alive
ETag: "5be6f15c-14"
Accept-Ranges: bytes

使用隐藏server:
server_tokens off; 
测试结果:
[[email protected]:55:48yum.repos.d]#curl -I 192.168.23.48
HTTP/1.1 200 OK
Server: testnginx --->已经改变成自定义
Date: Sat, 10 Nov 2018 14:58:11 GMT
Content-Type: text/html
Content-Length: 20
Last-Modified: Sat, 10 Nov 2018 14:55:24 GMT
Connection: keep-alive
ETag: "5be6f15c-14"
Accept-Ranges: bytes

具体配置项介绍:

主语句块配置:
Main 全局配置段常见的配置指令分类
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置

相关配置:
1 user [username groupname]:以哪个用户的身份运行
2 pid /path/to/pidfile_name:指定nginx的pid文件
注意:
1 进程结束pid文件自动删除
2 所在路径应该对所有者开放写权限
3 include file | mask  
指明包含进来的其它配置文件片断
4 load_module file:模块加载
模块加载配置文件:/usr/share/nginx/modules/*.conf  
指明要装载的动态模块路径: /usr/lib64/nginx/modules

以上是关于Nginx基础的主要内容,如果未能解决你的问题,请参考以下文章

nginx.conf 忽略了 nginx-ingress 配置映射片段

将 nginx rtmp 片段发送到 WebRTC

text 有用的nginx命令和片段

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

linux学习:Nginx--常见功能配置片段与优化-06

201555332盛照宗—网络对抗实验1—逆向与bof基础