nginx: 1.网络模型相关基础点 1.1内核空间与内核空间: 一个操作系统的核心组件,称之为内核,独立于普通的应用程序,可以直接操作底层硬件,处理系统受保护的区域 操作系统为了保护系统的核心区域,也就是内核,使得用户无法直接修改系统底层,因此操作系统就开辟了两块虚拟空 间,一是内核空间,二是用户空间 1.2进程切换 为了控制进程的执行,操作系统的内核需要有能力挂起cpu上运行的进程,还能恢复之前已挂起的进程 1.3进程阻塞 正在执行的进程,由于某些事件的等待,比如资源的加载中,资源加载失败,操作系统自动的就会阻塞该进程, 调用内核的block语句,让该进程处于阻塞状态,因此阻塞的进程是一种主动的行为 1.4文件描述符 这是计算机科学里的一个术语,表示指向文件引用的一个抽象概念,文件描述符是一个索引值,指向linux内核为每一 个进程打开的文件做记录的一个表 程序每打开一个文件,系统内核就向该进程发送一个文件描述符 ulimit -n 查看系统默认的文件描述符多大 1.5 linux IO 对linux的文件读写操作 数据的io操作:eg文件的读取,数据优先被拷贝的操作系统的内核缓冲区,然后再从缓冲区拷贝到应用程序的内存空间 本地io: 1.等待数据准备 2.数据从内核空间拷贝的用户进程空间 网络io 1.等待网络上的数据分段到达,然后复制到内核的缓冲区 2.数据从内核缓冲区拷贝到用户空间的应用程序 网络应用主要面临两个问题,数据计算,网络io延迟 网络的延迟,是造成性能低下的最大原因 网络io指的是在网络中进行数据的读,写操作,本质就是一个socket读写,sockte在linux中被抽象为流的概念 2.nginx基本语法 1.下载安装 1.1三大版本 nginx.com 商业版 nginx.org 开源版 https://tengine.taobao.org/ 1.2安装配置笔记 1.操作系统的选择 2.下载nginx的方式 1.rpm安装 2.yum工具自动化安装 3.获取源代码,手动编译安装nginx(指定安装路径,额外的开启nginx第三方的功能) 3.编译安装 ,要解决好linux的编译开发环境, gcc,make 编译工具 使用yum工具之前,必须配置好阿里云的yum源 0.确保有wget命令 yum install wget -y 1.备份旧的yum仓库文件 mkdir /etc/yum.repos.d/repobak mv /etc/yum.repos.d/* /etc/yum.repos.d/repobak 2.配置新的repo仓库文件 访问阿里云的镜像站: https://developer.aliyun.com/mirror/ 生成新的yum源 清空旧的 yum缓存 yum clean all 生成新的 yum缓存 yum makecache(加速下次下载) 3. yum install -y gcc gcc-c++ autoconf automake make # 安装 nginx所需的一些第三方系统库的支持, gzip lib库, pcre库, openssl 等待数据准备 4. yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel wget httpd-tools vim 5. 加载完所需的基础依赖库,还得 检查系统的防火墙是否关了,selinux关闭,yum配置,网络情况等.. iptables -L getenforce 6.nginx 编译安装 1.下载程序源代码 wget http://nginx.org/download/nginx-1.21.1.tar.gz wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz 2.解压源码 tar -zxvf xxx.tar.gz 进入源码目录 auto -检测系统模块依赖信息 changes -存放nginx的变化记录日记 conf -存放 nginx 主配置文件的目录 configure -可执行的脚本,用于释放编译文件的定制脚本 contrib -提供了vim插件,让配置文件颜色区分 html -存放标准的html页面 src -存放nginx源码的目录 3.编译三部曲 第一曲:进入软件源代码目录,执行编译脚本文件,如指定安装路径,及开启额外功能等 1. ./configure --help 查看编译信息 2.执行编译脚本文件,释放makefile等信息 ./configure --prefix=/opt/tngx232 --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio 第二曲:直接开始下一步安装 输入make指令 第三曲:如同windows的安装 make install 4.配置path环境变量 把nginx的sbin目录添加到path当中 export PATH="$PATH:/opt/tngx232/sbin/" 5.退出当前会话,重新登录,系统默认重新加载 /etc/profile.d下的所有环境变量文件 2.配置文件语法 * nginx.conf是由指令和指令块组成 * 每行语句都得有封号结束,指令与参数之间是由空格分隔的 * 指令块可以有大括号{}组织多条语句 * nginx.conf 使用#表示注释符 * nginx支持用$变量名该语法 * nginx 支持 include语句组合多个配置文件 * nginx部分指令支持正则表达式,如rewrite重写指令 3.Nginx命令行 1. nginx启动的指令, -s参数 指的是给nginx进程发送某种信号 nginx 初次启动,直接输入nginx,如启动后再执行该命令,会提示端口冲突(可以先停止nginx,再启动) nginx -s stop #停止nginx进程 nginx -s reload #平滑启动,利用reload可以在不重启nginx进程的情况下,重新读取配置文件 2.查看nginx命令的帮助信息 --nginx -h 参数 含义 -?,-h 输出nginx的帮助信息 -v 列出nginx的版本号 -V 列出nginx的版本和编译参数信息 -t 检测nginx的配置文件,语法是否正确 -T 检查配置,然后输出配置信息 -q 在检查配置文件期间屏蔽非错误信息 -s 给nginx主进程发送一个主信号,分别有 stop停止运行, quit优雅的停止,reload重读配置文件,reopon重新记录nginx日志 -p 设置nginx目录前缀 3.nginx 信号传递 1.nginx 主进程是不处理请求的,而是分配请求发给worker进程,主进程负责重启,热加载,热部署 2.master是根据nginx.conf中 worker_process定义启动时创建的进程数 3.当worker运行后,master就处于一个等待的状态,等待用户请求来临,或者系统信号 4.系统管理员可以发送 kill指令,或者nginx -s 信号,这样的形式操控nginx 4.nginx信号集 nginx -s 对应的信号功能如下 参数 信号 含义 stop TERM 强制关闭服务 null INT 强制关闭整个服务 quit QUIT 优雅的关闭整个服务 reopen USR1 重新打开日志记录 reload HUB 重新读取配置文件,并且优雅的退出旧的worker 4.功能模块 5.日志功能 0.日志切割:线上很常见的操作,能够控制单个日志文件的大小,便于对日志进行管理 1.针对访客日志进行切割 [root@iZuf66isl5i5hdqvge6jpqZ logs]# ll -h total 100K -rw-r--r-- 1 root root 79K Jul 12 22:35 access.log -rw-r--r-- 1 root root 8.9K Jul 12 21:58 error.log -rw-r--r-- 1 root root 6 Jul 12 00:05 nginx.pid 2.给当前日志文件重命名 注意使用mv命令 mv access.log `access.log_$(date + "%Y-%m-%d")` 3.发信号给nginx主进程,给他发送一个重新打开的信号,让nginx生成新的日志文件 nginx -s reopen # 该命令 等同于kill -USR1 `cat nginx.pid` 4.注意在以上的nginx重命名日志切割,不要立即对文件修改,而是要注意等待几秒钟,因为nginx的工作模式特点, master下发指令给worker去干活,刚发指令的时候只是一个标记,当业务量很大的时候,这个修改操作可能会有 点慢,不会立即生效 5.在生产环境下,日志切割主要是以定时任务的形式来操作 编写一个定时切割日志的脚本 vim cut_nginx_log.sh #!/bin/bash logs_path="/opt/tngx232/logs/" mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m") mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access_%(date -d "yesterday" + "%Y-%m-%d").log nginx -s reopen #kill -USR1 `cat /opt/tngx232/logs/nginx.pid` 完事后 可主动执行 bash cut_nginx_log.sh 6.把该脚本的执行,加入crontab 每天0点执行 crontab -e #打开定时任务 0 0 * * * /bin/bash /myscripts/cut_nginx_log.sh 注: 定时任务要绝对路径,否则定时任务会失效 6.访问限制 3.nginx功能实践 静态站点 反向代理 负载均衡 缓存服务 url重写 动静态请求分离 https lua开发 nginx安全 nginx调优