Nginx的程序架构: master/worker 一个master进程:---主进程 负载加载和分析配置文件、管理worker进程、平滑升级 一个或多个worker进程---子进程 处理并响应用户请求 缓存相关的进程: cache loader:载入缓存对象 cache manager:管理缓存对象 特性:异步、事件驱动和非阻塞 并发请求处理:通过kevent、epoll、select、/dev/poll 文件io:高级io sendfile,异步,mmap nginx模块:高度模块化,但其模块早期不支持dso机制(模块在编译支持时才能用),近期版本支持动态装载和卸载(只对特定模块); 模块分类:---主程序只是一个核心框架,其他功能包括web都是通过模块来实现 核心模块:core module 标准模块: HTTP modules: Standard HTTP modules---标准 Optional HTTP modules---可选 Mail modules Stream modules---流模块,实现传输层4层负载均衡 传输层代理 3rd party modules---第三方模块,非标准,自己打补丁才能用 nginx的功用: 静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器) 结合FastCGI(反代给fpmserver)/uwSGI/SCGI等协议反代动态资源请求;memcache反代给memcached server,http反代给web server,众多server都可以叫做后端服务器(backend) http/https协议的反向代理; imap4/pop3协议的反向代理; tcp/udp协议的请求转发; nginx的安装配置; 官方的预制包: 先使用yum info nginx查看一下有没有这个rpm包 http://nginx.org/packages/centos/7/x86_64/RPMS/---自己建立yum仓库指向这里(/etc/yum.repos.d/nginx.repo) Fedora-EPEL [nginx] name=nginx repository baseurl=http://nginx.org/packages/centos/7/x86_64/RPMS/ gpgcheck=0 yum repolist---查看仓库列表 yum install nginx 或者自己把官方的rpm包下载下来,在本地安装 编译安装: ~]#yum groupinstall "Development Tools" "Server Platform Development"---安装两个组,依然不能解决依赖关系 ~]#yum install pcre-devel openssl-devel zlib-devel(网络通信压缩库) ~]#useradd -r nginx---主控进程以root身份运行,worker以普通用户身份运行 ~]#./configure --prefix=/usr/local/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(进程文件路径) --lock-path=/var/run/nginx.lock(锁文件路径) --user=nginx --group=nginx(以什么用户组身份运行) --with-http_ssl_module --with-http_v2_module --with_http_dav_module(分布式版本协作,支持put、delete方法的模块,不需要就不安装,不安全) --with- http_stub_status_module(内建的状态页面类似httpd) --with-threads(线程池管理线程的逻辑,比默认的管理方式(work-process单个进程响应多少请求)更加高效 ) --with-file-aio(文件异步IO)(with额外装载的模块,nginx编译时,有些模块不会编译,会编译的不想使用就用without去掉) #make&makeinstall 安装以后设置开机自启---自己写一个unitfile 复制一下/usr/lib/systemd/system/nginx.service这个文件(这是指定官方仓库安装后的文件),并修改一下就可以了 systemctl start nginx.service 使用ss -tnlp查看监听端口 使用ps -axu查看nginx有几个worker 程序环境: 配置文件的组成部分: 主配置文件:/etc/nginx/nginx.conf Include conf.d/*.conf---把这个路径下所有以.conf结尾的配置文件都包含进来 fastcgi,uwsgi,scgi等协议相关的配置文件 mime.types:支持的mime类型---mime多用途互联网邮件扩展 主程序文件:/usr/sbin/nginx---这个主程序文件有很多参数,其中-V会显示编译的选项,我们可以复制,-s reload 可以重新装载配置文件不用重启服务-t可以测试配置文件语法 要想运行服务,可以直接使用命令也可以使用Unit File方式来启用(systemctl start nginx.service,ss -tnlp查看监听的端口,ps -aux查看启动的进程) 配置: 主配置文件的配置指令: directive value [value2......]; 注意: (1)指令必须以分号结尾; (2)支持使用配置变量; 内建变量:由nginx模块引入,可直接引用; 自定义变量:由用户使用set命令定义 set variable_name value;---也可以改内建变量的值 引用变量:$variable_name 主配置文件结构: main block:主配置段,也即全局配置段; event{ ... };事件驱动相关的配置 http{ ... };http/https协议相关的配置段; mail{ ... }; stream{ ... }; http协议相关的配置结构---没有中心主机的概念,就算只有一个主机也要配置成虚拟主机 http{ ... ...:各server的公共配置 server{ ... }:每个server用于定义一个虚拟主机; server{ ... listen---监听地址端口 server_name---主机名 root---相当于document_root,指定站点根目录 alias---路径别名 location[OPERATOR] URL{---基于url限制能不能访问,不能基于文件系统(也就是文件路径) ... if CONDITION{---基于条件来定义 ... } } } }

nginx可以实现event-driven、asynchronous、non-blocking 针对网络IO: 收到用户请求以后,nginx还可以管理缓存,后端服务器响应内容可以保存在nginx本地,然后再给用户响应,第二个用户请求时,查询缓存,如果有直接返回(实现加速) 而这个缓存空间,nginx需要两个进程来管理cache loader,cache manager 针对磁盘IO: 可以是实现高级IO、sendfile、AIO(异步IO模型)、mmap(内存映射,在内存中开辟空间映射硬盘数据,直接访问硬盘数据,不用复制,想想上一节课的两阶段)、etc

nginx作为web server:是一个master/worker模型,master用来装载配置文件,启动worker进程,平滑升级(不用停nginx,就能升级版本)

每次更改nginx的配置以后,要检查一下有没有语法错误nginx -t,并重新载入一下配置nginx -s reload

然后详细讲解安装nginx以后的配置文件/etc/nginx/nginx.conf user nginx; worker_processes auto;---配置工作进程数量,这里一般是自动,对应cpu核心数,改为更多意义不大 error_log /var/log/nginx/error.log;---错误日志 pid /run/nginx.pid worker_cpu_affinity auto;---把进程跟cpu自动一对一绑定

include /usr/share/nginx/modules/*.conf;---动态装载某些模块

events { worker_connections 1024;---这里对应上边的worker_processes,这里不可随意更改 }

http { log_format main '$remote_addr - $remote_user [$time_local] "$request" '---日志格式、日志的名称、内置的变量(客户端地址、远程用户(basic认证使用)、本地时间、请求报文的起始行) '$status $body_bytes_sent "$http_referer" '---响应码、body部分字节数、引用(从上次访问跳转过来的,怎么到当前网页的) '"$http_user_agent" "$http_x_forwarded_for" ';---什么浏览器、代理服务器在代理转发时会加一个真正客户端请求地址是谁 access_log /var/log/nginx/access.log main---访问日志、日志名称

sendfile	on;---发送文件,用户请求文件,由内核封装响应报文不用复制文件,提升性能
tcp_nopush	on;
tcp_nodelay	on;
keepalive_timeout	65;保持连接的超时时长
types_hash_max_size	2048;

include	/etc/nginx/mime.types;
default_type	application/octet-stream;---默认把每个文件识别成八进制的数据流
#load modular configuration files from the /etc/nginx/conf.d directory.
#see http://nginx.org/en/docs/ngx_core_module.html#include
#for more information.
include /etc/nginx/conf.d/*.conf;

server {
	listen		80 default_server;---基于域名的访问,默认虚拟主机,如果用户访问的虚拟主机找不到,就访问所有虚拟主机的第一个,不想第一个响应就设置默认的
	listen		[::]:80 default_server;---基于ipv6地址的访问
	server_name	_;---下划线可以匹配所有主机名
	root		/usr/share/nginx/html;---默认网页根路径

	#load configuration files for the default server block.
	include /etc/nginx/default.d/*.conf;

	location / {
	}

	error page 404 /404.html;---自定义错误页
		location = /40x.html {
	}

	error page 500 502 503 504 /50x.html;
		location = /50x.html {
	}
}

#setting for a TLS enabled server. }

那自己添加一个虚拟主机的做法 mkdir /data/nginx/vhost1 -pv ---最好和主机名一致 vim /data/nginx/vhost1/index.html vim conf.d/vhost1.conf server { listen 80; server_name www.ilinux.io;---给了主机名,访问的就是你定义的,不给访问的就是默认的 root /data/nginx/vhost1; } nginx -t测试语法 nginx -s reload重新载入配置文件不用重启

Nginx(2) 配置指令: main配置段常见的配置命令: 分类: 正常运行必备的配置 优化性能相关的配置 用于调试及定位问题相关的配置 事件驱动相关的配置 正常运行必备的配置: 1、user Syntax:user user [group]---组可以省略 Default:user nobody nobody; Context:main

				Defines user and group credentials used by worker processes.If group is omitted,a group whose name equals that of user is used.
			2、pid/PATH/TO/PID_FILE:
				指定存储nginx主进程进程号码的文件路径
			3、include file | mask(掩码就是通配符)
				指明包含进来的其他配置文件片段
			4、load_module file
			指明要装载的动态模块
		性能优化相关的配置
			1、worker_processer number | auto;
				worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
				auto:当前主机物理cpu核心数
			2、worker_cpu_affinity cpumask ...;---把进程跟cpu一对一绑定,可以提前隔离出cpu再绑定,也可以简单手工绑定(这种效果好),如果只运行nginx可以绑定,如果还要运行其他进程最好不要绑定
				worker_cpu_affinity auto [cpumask];
				cpu mask:---有4个cpu用4个0表示,有8个就用8个0
					00000001:0号cpu
					00000010:1号cpu
					00000100:2号cpu
			3、worker_priority number:
				指定worker进程的nice值,设定worker进程优先级;[-20,20]
			4、worker_rlimit_nofile number;
				worker进程所能够打开的文件数量上限
		调试、定位问题: