nginx大纲: nginx大纲.txt
1.nginx概述
1.1nginx基本介绍
nginx是一个web服务器。 开源 高性能(善于处理高并发,并且小号资源少) 高可靠。
1.2nginx优势
1.高性能,近w个连接请求时,他的响应要比其他的web要快。
2.高扩展性:nginx功能模块化。官方提供了很多的优秀模块。
3.高可靠性:9999 99999
4.热部署:不停止服务的情况下进行升级。
5.支持高并发,能支持几万并发连接
6.资源消耗少,在3万并发连接下开启10个nginx线程消耗的内存不到200
7.可以做http反向代理和负载均衡
8.支持异步网络i/o事件模型
1.3互联网公司都选择Nginx
代理、缓存、负载均衡静态资源处理、动静分离、LNMP、LNMT、LNMG 架构。
PS:5种 IO Model(了解)
1.1 阻塞IO (blocking I/O) # 烧开水--> A同学一直等着水烧开,什么也不干,开了再倒水。
1.2 非阻塞IO (noblocking I/O) # 烧开水--> B同学利用空闲做其他事情。定期跑过去检查。开了再执行倒水动作。
1.3 信号驱动IO没人用(signal blocking I/O) # 烧开水--> C同学在做其它事情,听到水壶响了。再进执行倒水动作。
1.4 多路复用(I/O multiplexing) # 烧开水--> D同学有钱任性的买了五个壶同时烧水,增加烧开水的几率。
IO多路转复用是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO的高。
1.5 异步IO(asynchronous I/O) # 更有钱--->老板雇漂亮顾保姆给他烧水,只享受从水壶倒出热水泡茶的过程
区别与联系: 前4种模型都有等 && IO两个阶段,即将数据从内核拷贝到调用者的缓冲区,自己等,自己进行数据搬迁。
所以统称为同步IO。 与第5种 异步IO相区分。
-----------------------------------------------------------------------------------------------------------------------、
阻塞与非阻塞(等于不等的区别)
#同步阻塞 (一直等待工作完成,也没消息)
同步非阻塞(来来回回检查工作进度,添加cpu负担)
#异步阻塞 (有消息,但工作没完成--> 等待)
异步非阻塞(主动的小伙子,把文案主动送给老板看)
select(同步非阻塞--> Apach>) #宿管大妈挨个房间找:轮询I/O是最耗时间的操作,虽然能最快拿到结果
epooll(异步非阻塞--->nginx) #宿管大妈有本本记录房间: 高并发能力强
关于网络模型——>5种IO网络模型 彻底理解同步 异步 阻塞 非阻塞
2.Nginx应用场景
常用场景:
- web服务
- 负载均衡
- 代理缓存
- 安全服务 Https Lua
- 动静分离 Nginx+Tomcat
- 静态资源服务
3.Nginx组成部分
- nginx二进制文件
- nginx.conf配置文件
- nginx access日志
- nginx error日志
nginx目录结构(编译安装)
[root@web01 ~]#rpm -ql nginx
/etc/logrotate.d/nginx /etc/nginx /etc/nginx/conf.d #nginx配置文件 全局配置( 作用于整个Nginx ) /etc/nginx/conf.d/default.conf /etc/nginx/fastcgi_params /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/mime.types /etc/nginx/modules /etc/nginx/nginx.conf #主配置文件 ( 驾驶员 ) /etc/nginx/scgi_params /etc/nginx/uwsgi_params /etc/nginx/win-utf /etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /usr/lib64/nginx /usr/lib64/nginx/modules /usr/libexec/initscripts/legacy-actions/nginx /usr/libexec/initscripts/legacy-actions/nginx/check-reload /usr/libexec/initscripts/legacy-actions/nginx/upgrade /usr/sbin/nginx #编译出来的二进制文件 ( 汽车 ) /usr/sbin/nginx-debug /var/cache/nginx /var/log/nginx #访问日志和错误日志
4.Nginx快速安装
nginx安装
使用YUM安装 <—简单
yum install nginx -y
使用源码编译
http://nginx.org/packages/centos/7/x86_64/ nginx版本 http://nginx.org/en/linux_packages.html 官方源
nginx命令参数说明:
-V --- 显示nginx程序配置信息(加载功能模块信息)
-t --- 检查配置文件语法信息
-T --- 检查配置文件语法信息 将所有配置内容进行输出显示
-q --- 检查配置文件语法信息时 非错误消息进行抑制输出
-s --- 发送信号使程序停止或者平滑重启 -s reload -s stop
-p --- 指定nginx主程序目录
-c --- 识别主配置文件信息
5.Nginx基本配置
配置详解
[root@web01 ~]# grep -Ev "#|^$" nginx.conf.bak >nginx.conf && cat nginx.conf
#全局配置( 作用于整个Nginx )
user nginx;
--- 指定服务work进程管理用户信息 提升服务安全性
(nginx: master process --- 控制服务运行状态)
(nginx: worker process --- 处理用户访问请求)
worker_processes 4;
--- 定义服务worker进程数量 服务器硬件性能CPU总核心数 >=worker进程数量
error_log /var/log/nginx/error.log warn;
--- 错误日志保存路径信息 定义错误记录级别
pid /var/run/nginx.pid;
--- 记录系统程序pid文件
events
worker_connections 1024;
--- 记录服务并发连接数量 进程数*连接数 <= 系统最大打开文件
}
http {
include /etc/nginx/mime.types;
--- 加载扩展配置文件
mime.types --- 定义默认可以识别静态资源类型信息
default_type application/octet-stream;
--- 默认识别资源类型,不识别则下载
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
--- 定义日志格式
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
---调用设置好格式 指定访问日志路径信息
keepalive_timeout 65; --- 超时时间设置
include /etc/nginx/conf.d/*.conf; --- server配置文件 server==网站
http、server、location之间的关系
http:主要用来解决用户的请求和响应。 www test tt
server:主要用来响应具体的某一个网站。
location:用于匹配网站的uri路径。
http{} 下面可以有多个
server{} 下面可以有多个 #一个server对应着一个网站
location {} 可以有多个
6.Nginx搭建网站
1.配置nginx,yum源:
```javascript
cat >/etc/yum.repos.d/nginx.repo<<’EOF’
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
2.准备一个游戏的源码 ( qq下载的 )<br />准备一个目录,存放我们的游戏<br />`[root@web01 ~]# mkdir /code`<br />`[root@web01 ~]# cd /code`<br />`[root@web01 ~]# unzip h5game.zip`
3.配置Nginx<br /> 配置监听的端口<br /> 配置网站的域名<br /> 配置用户访问网站路径规则 location<br /> 配置默认返回的页面
[root[@web01 ](https://www.yuque.com/web01) ~]# `cat /etc/nginx/conf.d/game.oldxu.com.conf`
```powershell
server {
listen 80; #配置监听的端口
server_name game.oldxu.com; #配置网站的域名
location / { #配置用户访问网站路径规则location里有网站首页
root /code;
index index.html; #配置默认返回的页面,首页为index.html
}
}
4.检查nginx的语法
成对出现{} 每一条指令的结尾都有 ;
[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
5.重启服务,让配置生效[root@web01 code]# systemctl restart nginx
6.nginx访问网站(详细过程)
game.oldxu.com 如何访问到网站的?
第一步:浏览器请求 game.oldxu.com 第二步:浏览会将请求的 game.oldxu.com —> http://game.oldxu.com/ 第三步:浏览器对 域名进行解析 DNS解析 ( 我们域名是假的,所以,我们配置 hosts 劫持 ) 第四步:浏览器通过随机端口,像服务端 80 端口建立TCP连接 第五步:浏览器发起HTTP的请求 第六步:请求被80端口对应的Nginx应用所接受,会交给http层,发现请求的域名是game.oldxu.com 第七步:接下来检查所有配文件,看是否有配置文件 满足用户请求的域名。 server_name 第八步:满足域名匹配之后,检查用户请求的路径, / 就会被location / 所匹配 第九步:返回结果,/code下面的index.html 给用户 第十步:nginx应用程序像内核发送请求,获取磁盘中的某个文件,磁盘将数据拷贝至内核的缓存区,然后在 拷贝到nginx应用进程的缓存区 第十一步:nginx应用进程封装数据报文,回传给客户端浏览器。
对应真实服务器磁盘的路径在那里?
/code 目录下
找不到为啥是403 而不是404 ?
—-> 返回的默认主页找不到
配置文件查看一下路径
站点目录是否有权访问
7.Nginx虚拟主机
如果没有都虚拟主机,一个网站就对应一台服务器,成本高。 虚拟主机—-> 一台服务器运行多个站点。 资源所在的路径uri
链接地址url
7.1 基于多 IP 方式(较少)
(前提:需要多个IP地址)
主机 | 返回结果 |
---|---|
10.0.0.7 | 返回 hello 10.7 |
172.16.1.7 | 返回 hello 172.7 |
[root@web01 ~]# cat /etc/nginx/conf.d/ip.conf
server {
listen 10.0.0.7:80;
location / {
root /ip1;
index index.html;
}
}
server {
listen 172.16.1.7:80;
location / {
root /ip2;
index index.html;
}
}
[root@web01 ~]# mkdir /ip1
[root@web01 ~]# mkdir /ip2
[root@web01 ~]# echo "hello,10.7" > /ip1/index.html
[root@web01 ~]# echo "hello,172.7" > /ip2/index.html
[root@web01 ~]# systemctl restart nginx
新增配置文件用restart 修改配置文件用reload (平滑启动)
测试
[root@web01 ~]# curl 10.0.0.7:80
hello,10.7
[root@web01 ~]# curl 172.16.1.7:80
hello,172.7
7.2 基于多端口方式(测试)
(测试listen里配置监听不同端口)
主机 | 返回结果 |
---|---|
10.0.0.7 | 8080 |
10.0.0.7 | 8081 |
[root@web01 ~]# cat /etc/nginx/conf.d/port.conf
server {
listen 8081;
location / {
root /port1;
index index.html;
}
}
server {
listen 8082;
location / {
root /port2;
index index.html;
}
}
[root@web01 ~]# mkdir /port1
[root@web01 ~]# mkdir /port2
[root@web01 ~]# echo "8081" > /port1/index.html
[root@web01 ~]# echo "8082" > /port2/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx
7.3 基于多域名方式(生产)
(生产) 记得配置域名解析
(我们由于是假的域名,所以配置DNS劫持即可)
域名 | 返回结果 |
---|---|
docs.oldux.com | docs |
test.oldxu.com | test |
[root@web01 ~]# cat /etc/nginx/conf.d/all.oldxu.com.conf
server {
listen 80;
server_name docs.oldxu.com;
location / {
root /docs;
index index.html;
}
}
server {
listen 80;
server_name test.oldxu.com;
location / {
root /test;
index index.html;
}
}
[root@web01 ~]# mkdir /docs
[root@web01 ~]# mkdir /test
[root@web01 ~]# echo "docs" > /docs/index.html
[root@web01 ~]# echo "test" > /test/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx