HTTP:HyperText Transfer Protocol(超文本传输协议) HTML:HyperText Markup Language(超文本标记语言) MIME:Multipurpose Internet Mail Extension(多用途互联网邮件扩展)
- text/plain
- text/html
URL:Uniform Resource Locator(统一资源定位符)
- schema://server[:port]/path/to/source
http事务
request<-------->response
协议格式:文本、二进制
method
- GET
- POST
- HEAD
- DELETE
- PUT
- TRACE
- OPTIONS
status
- 1xx:信息类
- 2xx:成功类,200
- 3xx:重定向,301,302,304
- 4xx:客户端错误,401,403,404
- 5xx:服务器内部错误,500,502
header
- If-Modified-Since
- If-None-Match
Web页面
- PV(Page View)入口请求算一个PV
- UV(User View)独立IP算一个UV
认证
I/O类型
- 同步(synchronous)和异步(asynchronous)
关注的是消息通知机制 同步:调用发出后,不会立即返回,但一旦返回,则返回即是最终结果 异步:调用发出后,被调用方立即返回消息,但返回的并非最终结果,被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果 - 阻塞(block)和非阻塞(nonblock)
关注的是调用者等待被调用者调用结果时的状态 阻塞:调用结果返回之前,调用者会被挂起,调用都只有在得到调用结果之后才能继续 非阻塞:调用者在结果返回之前不会被挂起,调用不会阻塞调用者
I/O模型
- 阻塞式IO(blocking IO)
- 非阻塞IO(nonblocking IO)
- IO多路利用(IO multiplexing)
- 信号驱动IO(signal driven IO)
- 异步IO(asynchronous IO)
Nginx特性
- 模块化设计,较好的扩展性
- 高可靠
- 一个主进程master,
- 不负责响应任何nginx请求
- 负责生成worker进程和删除worker进程
- 解析配置文件,无需重启,让配置文件中内容重新加载,完成平滑版本升级
- 创建关闭套接字
- 低内存消耗(10000万个keep-alive模式下的conn仅需要2.5M内存)
- 支持热部署(不停机更新配置文件,日志文件滚动,升级程序版本)
- 支持事件驱动,AIO,mmap
Nginx基本功能
静态的web服务器,能缓存打开的文件描述符 支持http,smtp,pop3协议的反向代理服务器 缓存加速、负载均衡 支持FastCGI(fpm,LNMP),uWSGI(Python) 模块化(非DSO机制)、过滤器zip、SSI及图像大小调整 支持SSL
Nginx扩展功能
- 基于名称和IP的虚拟主机
- 支持keepalive
- 支持平滑升级
- 定制访问日志、支持使用日志缓冲区提供日志存储性能
- 支持URL Rewrite
- 支持路径别名
- 支持基于IP及用户的访问控制
- 支持速率限制,支持并发数限制
Nginx基本架构
一个master进程,生成1个或多个worker进程 事件驱动:epoll(边缘触发)、kqueue(BSD),/dev/poll(Sorials) 复用器:select ,poll,rt signal 支持Sendfile,sendfile64 支持AIO 支持mmap
Nignx工作模式
非阻塞、事件驱动、由一个master进程生成多个worker进程,每个worker响应n个请求
Nginx模块类型
- 核心模块(core modules)
- 标准HTTP模块(Standard http modules)
- 可选HTTP模块(Optional http modules)
- 邮件模块(Mail Modules)
- 第三方模块
Nginx配置文件
main配置段:全局配置段 event:定义event模型工作特性 http{}:定义http协议相关的配置 配置指令:以;结尾 directive value1 [value2…]; 支持使用变量 内置变量:模块会提供内置变量定义 自定义变量:set var_name value
main配置段
- 用于调试、定位问题
- 正常运行必备的配置
- 优化性能的配置
- 事件相关的配置
main配置段正常运行的必备配置
- user USERNAME [GROUPNAME] :用于指定运行worker进程的用户和组
- pid /path/to/pid_file :指定nginx守护进程的pid文件
- worker_rlimit_nofile #:指定所有woker进程能打开的最大文件句柄数
- worker_rlimit_core #:指定所有woker进程能打开的最大核心文件大小,一般不用调整
性能优化相关配置 - worker_processes #:worker进程的个数,通常少于CPU物理核心数,支持auto
- worker_cpu_affinity cpumask …:用于绑定CPU核心,提升缓存命中率,无法避免进程切换【进程切换CPU会产生不必要的消耗】,cpumask: 0000 0000 0000 0001 0000 0010,如worker_cpu_affinity 00000001 00000010 00000100,可以使用auto
- timer_resolution interval:计时器解析度:降低此值,可减少gettimeofday()
- worker_priority #:指定worker进程nice值(优先级),[-20,19],nice值越小,优先级越高
事件相关配置 - accept_mutex on|off:master调度用户请求至各woker进程时使用的负载均衡锁,on表示让多个woker轮流,序列化响应用户请求。
- lock_file file:accept_mutex锁文件路径
- use [epoll|rtsig|select|poll]:指明使用的事件模型,建议nginx自行选择
- work_connections #:设置一个worker进程能接受的最大并发连接数
用于调试、定位问题 - daemon [on|off]:是否以守护进程方式运行nginx,调试时设置为off
- master_process [on|off]:是否以master/worker模型来运行nginx,调试时可设置为off
- error_log file [level]:错误日志记录位置,若使用debug级别,需要编译nginx时打开–with-debug选项
新修改配置生效的方式:/usr/local/nginx/sbib/nginx -s reload Nginx作为web服务器使用配置
http {}:由ngx_http_core_module模块所引入,位于ngx_http_core_module下
配置框架
http {
upstream {
...
}
server {
location URL{
root /path/to/source
...
} #类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系
location URL {
if ...{
}
}
...
}#每个server类似于httpd中的一个<VirtualHost>
}
注:与http相关的指令仅能够放置于http,server,location,upstream,if上下文
- server {}:定义一个虚拟主机,位于ngx_http_core_module下
#在http标签里添加server配置,定义基于端口的虚拟主机
server {
listen 8080;
server_name www.tye.com;
root /vhosts/web1;
}
[root@nginx01 ~]# mkdir -p /webdata/web1
#创建网页文件
[root@nginx01 ~]# cat /webdata/web1/index.html
<h1>tye web site!!!</h1>
#访问刚创建的页面
[root@nginx01 ~]# curl www.tye.com:8080
<h1>tye web site!!!</h1>
- listen #:指定监听的地址和端口,位于ngx_http_core_module下
listen address [:port]
listen port
- server_name NAME[…]:后可跟多个主机,名称还可以使用正则表达式(~)或通配符
#-----------匹配规则-------------
#1.先做精确匹配检查
#2.左侧通配符匹配检查:*.tye.com
#3.右侧通配符匹配检查:mail.*
#4.正则表达式匹配检查:如~^.*\.tye\.com$
#5.default_server
#-----------匹配规则-------------
server {
server_name www.tye.com;
}
server {
server_name *.tye.com;
}
- root path:设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径,位于ngx_http_core_module下
- location [ = | ~ | ~* | ^~ ] uri { … }:允许根据用户请求的URI来匹配定义的各location,匹配时,此请求被相应的location配置模块中的配置所处理,如访问控制等功能,位于ngx_http_core_module下
# = 表示精确匹配检查
# ~ 正则表达式模式匹配检查,区分字符大小写
# ~* 正则表达式模式匹配检查,不区分大小写
# ^~:URI的前半部分匹配,不支持正则表达式
#匹配优先级:精确匹配(=)-->(^~)-->(~)-->(~*)-->(不带任何符号的location)
server {
listen 80;
server_name www.tye.com;
location / {
root /webdata/web1;
}
location /image/ {
root /webdata/image;
}
location ~* .php$ {
fcgipass:
}
}
- alias path:用于location中,定义路径别名,位于ngx_http_core_module下
#注:root表明路径为对应的locaiton "/" URL;alias表示路径映射,即location指令后定义的URL是相对于alias指明的路径而言
location /images/ {
root "/webdata/web1"
}
http://localhost/images/a.jpg <--------/webdata/web1/images/a.jpg
location /images/ {
alias "/webdata/web1"
}
http://localhost/images/a.jpg <--------/webdata/web1/a.jpg
- index file:定义默认主页,ngx_http_index_module
- error_page code … [=[response]] uri:根据http响应状态码来指明特定的错误页面,,位于ngx_http_core_module下
#定义错误页面,并将响应码定义为200,当用户访问页面出错时,响应码将返回200而不是404
error_page 404 =200 /404.html;
#allow IP/network
#deny IP/network
location / {
root html;
deny 127.0.0.1;
}
#auth_basic
#auth_basic_user_file,建议使用htpasswd生成
location / {
root html;
#deny 127.0.0.1;
auth_basic "Only For VIP";
auth_basic_user_file /etc/nginx/users/.htpasswd;
}
[root@nginx01 ~]# htpasswd -c -m /etc/nginx/users/.htpasswd tye
New password:
Re-type new password:
Adding password for user tye
[root@nginx01 ~]# cat /etc/nginx/users/.htpasswd
tye:$apr1$JX0ejwHf$806WngIYz.uRGt3qIzW.o1
#----测试
[root@nginx01 ~]# curl localhost/tye.txt
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.21.6</center>
</body>
</html>
[root@nginx01 ~]# curl -utye:123456 localhost/tye.txt
/tye.txt
#----测试
|