Day 49 Nginx

1.1 http原理

    DNS解析

    TCP三次握手

    TCP四次挥手

    HTTP请求头信息

    HTTP响应头信息

1.1.1 用户访问网站流程:

    1.用户输入域名->浏览器跳转->DNS解析( 递归查询 | 迭代查询 )

        客户端向服务端发起查询->递归查询

        服务端向服务端发起查询->迭代查询

    2.由浏览器向服务端发起TCP连接(三次握手)

        客户端  -->请求包连接-syn=1 seq=x         服务端

        服务端  -->向应客户端syn=1 ack=x+1 seq=y  客户端

        客户端  -->建立连接  ack=y+1 seq=x+1 服务端

    3.客户端发起http请求:

        1.请求的方法是什么: Get 获取

        2.请求的Host主机是: www.oldboyedu.com

        3.请求的资源是什么: /index.html

        4.请求的端口是什么: 默认http80  https 443

        5.请求携带的参数是: 属性(请求的类型、压缩、认证、等等)

    4.服务端响应的内容是:

        1.响应服务端使用的软件(nginx

        2.响应请求文件的类型

        3.响应请求的文件是否进行压缩

        4.响应请求的主机是否进行长连接

    5.客户端向服务端发起TCP断开(四次挥手)

        客户端  --> 断开请求 fin=1 seq=x           -->      服务端

        服务端  --> 响应断开 fin=1 ack=x+1 seq=y   -->      客户端

        服务端  --> 断开连接 fin=1 ack=x+1 seq=z   -->      客户端

        客户端  --> 确认断开 fin=1 ack=z+1 seq=sj  -->      服务端

   

第2章  

2.1  Nginx是一个开源且高性能、可靠的HttpWeb服务、代理服务。

开源: 直接获取源代码

高性能: 支持海量并发

可靠: 服务稳定

nginx+lua 可实现waf防火墙   7层应用层防火墙  http://

传统防火墙工作在四层tcp/udp (22|80)

    1.花钱解决问题()

    2.自己解决问题(浪费时间、没有上浮空间、)

2.2  为什么选择 Nginx

2.2.1  Nginx非常轻量

    1.功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)

    2.代码模块化(易读,便于二次开发,对于开发人员是非常友好)

2.2.2 互联网公司都选择Nginx

    1.技术成熟, 大公司都选择Nginx

    2.统一技术选型工具Nginx, 降低维护成本,减少故障几率。

    3.Nginx涉足场景较多,技术更新成本低。

2.2.3 Nginx采用Epool网络模型, Apache采用Select模型。

    Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。

    Epool: 当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制。

2.3 Nginx 应用场景

    静态处理(mp4|html|png|jpg  -> 服务端存放的是什么,客户端浏览器就展示什么

    反向代理

    负载均衡

    代理缓存()

    访问限制(tcp连接数、http请求数)

    访问认证(用户和密码、来源IP)

    安全防护(waf防火墙,使用lua实现的,花钱买服务,花钱买经验)

2.4 Nginx安装

    1.epel仓库=>Nginx(1.版本低 2.配置文件不一样)

    2.源码编译=>Nginx(1.复杂   2.企业不使用)

    3.官方仓库=>Nginx)(1.版本较新 2.安装简单 3.配置不复杂)

 

2.4.1 配置Nginx官方的仓库

[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/7/$basearch/

gpgcheck=0

enabled=1

 

2.4.2 安装Nginx【一定确认是通过官方的仓库安装上】

[root@web01 ~]# yum install nginx -y

 

2.4.3 检查版本【1.14.0

[root@web01 ~]# nginx -v

nginx version: nginx/1.14.0

 

2.4.4  查看nginx编译的参数

nginx -V

 

2.4.5  编译参数越多越好,还是越少越好?

源码编译好了,做成的rpm

越少:功能少,后期可维护性差

越多:功能全,覆盖广,可维护性强

 

2.5 Nginx配置文件

Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

1.CoreModule 核心模块

2.EventModule 事件驱动模块

3.HttpCoreModule http内核模块

       server  代表1网站[视频]

            location 定义网站访问的路径

        server  代表2网站[博客]

        server  代表3网站[论坛]

2.5.1 需了解扩展项

CoreModule层下可以有EventHTTP

HTTP模块层允许有多个Server, Server主要用于配置多个网站

Server层又允许有多个Location, Location主要用于定义网站访问路径

 

[root@web01 ~]# cat /etc/nginx/nginx.conf

user  nginx;                                # 运行nginx程序的用户

worker_processes  1;                        # 运行的进程数量

error_log  /var/log/nginx/error.log warn;   # 错误日志

pid        /var/run/nginx.pid;              # 存放nginx进程运行的pid

 

events {                                    # 事件模块开始

    worker_connections  1024;               # worker进程的最大连接数

    use epool;                              # 事件使用的模型(默认epool)

}                                           # 事件模块结束

 

http {                                      # http开始

    include       /etc/nginx/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"';

   

    # 访问日志存放的路径【main是日志的格式】

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    #tcp_nopush     on;

    keepalive_timeout  65;                  # 长连接

    #gzip  on;                              # 压缩

    include /etc/nginx/conf.d/*.conf;       # 所有的conf结尾的文件都被包含起来

   

    server {                                # 我要定义一个网站【博客】

    listen       80;                        # 监听80端口

    server_name  localhost;                 # 对应的域名

   

    location / {                            # 用户请求域名时,默认匹配的规则

        root   /usr/share/nginx/html;       # 网站根目录

        index  index.html index.htm;        # 返回的默认页面

    }

 

    error_page   500 502 503 504  /50x.html; # 定义错误页面的

    }

}

 

2.6 部署一个站点:

2.6.1 对应的nginx配置文件

[root@web01 conf.d]# cat /etc/nginx/conf.d/oldboy_game.conf

server {

    listen 80;

    server_name game.oldboy.com;

 

    location / {

       root /oldboy_code;

       index index.html;

    }

}

2.6.2 对应的源代码文件【手动-low

[root@web01 conf.d]# mkdir /oldboy_code

[root@web01 conf.d]# cd /oldboy_code/

[root@web01 oldboy_code]# rz  html5.zip

[root@web01 oldboy_code]# unzip html5.zip

[root@web01 oldboy_code]# pwd

/oldboy_code

[root@web01 oldboy_code]# ls

ceshi  game  html5.zip  img  index.html  readme.txt

 

2.6.3 检查nginx的语法

[root@web01 oldboy_code]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

 

2.6.4 重载Nginxreload|restart

[root@web01 oldboy_code]# #nginx -s reload

[root@web01 oldboy_code]# systemctl reload nginx

 

2.6.5 5.如何访问:

    1.通过服务器的IP直接访问:10.0.0.7

    2.通过域名方式访问

        Windows:   C:\Windows\System32\drivers\etc\hosts 文件

        Mac:       sudo vim /etc/hosts

        10.0.0.7   game.oldboy.com

    3.使用ping命令测试域名解析是否正常

 

2.6.6 Nginx搭建静态游戏网页

    1.具备Nginx的配置文件[/etc/nginx/conf.d/xx.conf]

    2.根据nginx配置文件中定义的路径,准备对应的源代码

    3.运行对应的Nginx

    4.客户端通过域名访问【hosts文件进行解析域名-->假】