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 架构。

  1. PS5 IO Model(了解)
  2. 1.1 阻塞IO blocking I/O # 烧开水--> A同学一直等着水烧开,什么也不干,开了再倒水。
  3. 1.2 非阻塞IO noblocking I/O # 烧开水--> B同学利用空闲做其他事情。定期跑过去检查。开了再执行倒水动作。
  4. 1.3 信号驱动IO没人用(signal blocking I/O # 烧开水--> C同学在做其它事情,听到水壶响了。再进执行倒水动作。
  5. 1.4 多路复用(I/O multiplexing # 烧开水--> D同学有钱任性的买了五个壶同时烧水,增加烧开水的几率。
  6. IO多路转复用是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO的高。
  7. 1.5 异步IOasynchronous I/O # 更有钱--->老板雇漂亮顾保姆给他烧水,只享受从水壶倒出热水泡茶的过程
  8. 区别与联系: 4种模型都有等 && IO两个阶段,即将数据从内核拷贝到调用者的缓冲区,自己等,自己进行数据搬迁。
  9. 所以统称为同步IO 与第5 异步IO相区分。
  10. -----------------------------------------------------------------------------------------------------------------------、
  11. 阻塞与非阻塞(等于不等的区别)
  12. #同步阻塞 (一直等待工作完成,也没消息)
  13. 同步非阻塞(来来回回检查工作进度,添加cpu负担)
  14. #异步阻塞 (有消息,但工作没完成--> 等待)
  15. 异步非阻塞(主动的小伙子,把文案主动送给老板看)
  16. select(同步非阻塞--> Apach>) #宿管大妈挨个房间找:轮询I/O是最耗时间的操作,虽然能最快拿到结果
  17. epooll(异步非阻塞--->nginx) #宿管大妈有本本记录房间: 高并发能力强

关于网络模型——>5种IO网络模型 彻底理解同步 异步 阻塞 非阻塞

2.Nginx应用场景

image.png

常用场景:

  • web服务
  • 负载均衡
  • 代理缓存
  • 安全服务 Https Lua
  • 动静分离 Nginx+Tomcat
  • 静态资源服务

3.Nginx组成部分

  • nginx二进制文件
  • nginx.conf配置文件
  • nginx access日志
  • nginx error日志
    39. Nginx概念简述 - 图2

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