Nginx 从了解到入门

Nginx
HTTP 超文本传输协议 是一个基于    TCP/IP通信协议来传递数据
Nginx基于HTTP HTTP基于TCP/IP
HTTP 默认端口为80 
HTTP 三个特点 无连接(服务器处理完请求 并收到客户应答后 便断开连接)
                媒体独立(符合客户端和服务器处理的数据 都可以经过HTTP传输)
                无状态 (事务处理无记忆性)
客户端发布一个HTTP请求到服务器的请求消息包括 由请求行 请求头部 空行 请求数据 四部分组成
HTTP响应也是由四部分组成 状态行 消息报头 空行 响应正文
客户端请求 
Connected to www.testpm.cn (47.244.247.240) port 80 (#0)
> GET /hello.txt HTTP/1.1   # 请求方式与版本协议。
> User-Agent: curl/7.29.0   #用什么客户端访问
> Host: www.testpm.cn  #主机名,域名。主机和端口号,
> Accept: */*  #匹配什么文件类型,“*” 是通用匹配。匹配所有类型
服务端响应
< HTTP/1.1 200 OK       #请求返回的状态码
< Server: nginx/1.16.0  #请求的服务和版本号
< Date: Thu, 04 Jul 2019 08:19:40 GMT
< Content-Type: text/plain #文本类型,有html,plain:普通文本
< Content-Length: 12
< Last-Modified: Thu, 04 Jul 2019 08:13:25 GMT
< Connection: keep-alive  #是否支持长连接
< ETag: "5d1db525-c"  #标识,每次访问如果与最开始的一样返回304否则校验不一致返回200
< Accept-Ranges: bytes


HTTP请求方法 
1.0版本定义 GET POST HEAD方法
GET:单纯获取数据
POST:上传/创建文件
PUT:保存数据 覆盖更新文件 不会产生新的数据
DELETE:删除
1.1版本 新增五种请求方法 OPTIONS PUT DELETE TRACE  CONNECT


HTTP状态码     
200 请求成功
301 资源重定向到其他URL 永久
302 资源临时重定向到其他URL
404 请求的资源不存在
403 服务器拒绝客户请求
500 内部服务器错误
1开头为服务器收到请求 需要进一步指令
2开头为成功    3资源重定向    4客户端错误    5服务器错误


Nginx 是一个高性能WEB和反向代理服务器 特点 稳定 功能集丰富 示例配置文件 由c语言编写 低系统资源消耗
        支持perl语法 bugs少 并发量较高8000-20000 异步非阻塞 
异步 非阻塞 每进来一个request 会有一个worker进程去处理 处理到可能发生阻塞的地方 worker则会去处理其他线程
回调 他会在发送完请求后 注册一个事件 如果upstream返回  当上游服务器返回 会触发这个事件 worker会来接手 request会继续往下走 


Nginx 编译参数 --prefix= 指向安装目录 --conf-path=指向配置文件
修改 配置文件 /etc/nginx/nginx.conf
user nginx; 指定用户
worker_processes   2; 设置nginx启动进程的数量 一般与逻辑cpu数量相同
error_log  logs/error.log;(相对路径)    指定错误日志
worker_rlimit_nofile 10240; 设置nginx进程能打开的最大文件数量
pid       /var/run/nginx.pid; 
events {
        worker_connections  1024; 设置最大可连接数
}
http {
    include   mime.types;  指向头文件位置
    default_type     核心模块指令
    log_format main
    access_log  /var/log/nginx/access.log   main;        指向访问日志位置和格式
    sendfile      on; 是否调用sendfile函数输出文件 一般设置为on 如果nginx用来进行磁盘io负载应用时 可以设置为off 降低系统负载
    gzip          on; 是否开启压缩
    keepalive_timeout  60;设置超时连接时间
server {
    listen  80;设置监听端口
    server_name localhost; 设置绑定的主机名 域名 或者 ip地址
    charset koi8-r; 设置编码字符
    charset utf-8; 
    location / {
        root /var/www/nginx; 设置服务器默认网站的根目录;
        index index.html index.htm; 设置默认打开文档
    }
    error_page 500 502 503 504 /50x.html; 设置错误信息返回页面
    location = /50x.html {
        root html; 这里设置绝对位置
    }
}


Nginx 常用命令
-s 修改配置后使生效 nginx -s reload
-s 快速停止nginx    nginx -s stop
-t 测试当前配置文件是否正确
-v 查看版本
-V 查看配置信息

配置编译安装的systemctl 
在/usr/lib/systemd/system/nginx.service里
覆盖添加
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid 指定pid目录
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf 指定启动目录
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" 指定杀死的进程目录
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"同上

[Install]
WantedBy=multi-user.target
因为目录一样 不需要改配置 然后杀死进程 重启便可


什么是虚拟主机 
可以将一台计算机分成多个虚拟主机 每个虚拟主机可以独立对外提供WEB服务 可以实现一台主机对外提供多个WEB服务 每个主机之间相互独立 互不影响。
作用 可以充分发挥服务器的性能 提高计算机的利用率 高并发 在一个服务器配置多个不同的    WEB
systemctl daemon-reload 重新加载系统启动文件
nginx实现虚拟主机 支持三种类型 基于域名 基于ip 基于端口
nginx 日志文件分为 log_format 和 accsee_log 两部分
log_format 定义记录的格式 其语法为
   log_format   样式名称   样式详情
扩展 
$http_x_forwarded_for 客户端的真实ip 直接访问服务器的ip 可以是代理服务器ip
$remote_user 客户端的名称
$time_local 访问时的本地时间
$request 请求 URL 和 http 协议
$status 访问的状态码
$body_bytes_sent 发送给客户端的主体内容大小
$http_referer 记录客户端是从那个页面链接访问过来的 若没有则为'-'
$http_user_agent 记录客户端使用的浏览器的相关信息
C:\Windows\System32\drivers\etc windows 本地域名解析文件位置
编辑location / {
        limit_rate 2k; 对每个链接限速为2k/s
        autoindenx on; 可以把页面变成下载页面
}
反向代理 隐藏真实服务器 用户的请求被代理服务器接受
正向代理 隐藏真实用户 服务器只知那个代理器请求
代理服务器的配置文件编写
    vim /etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass http://被代理的ip和端口; 真实服务器的地址 可以是ip也可以是域名和url地址
    proxy_set_header Host $http_host; 重新定义或者添加发往后端服务器的请求头
    proxy_set_header X-Real-IP $remote_addr; 启动客户端的真实地址(日志显示)
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 记录代理地址
    proxy_connect_timeout 30; 后端服务器连接的超时时间发起三次握手等待响应超时
    proxy_send_timeout 60; 后端服务器数据回传时间 在规定时间之内后端服务器必须传送完所有的数据
     proxy_send_timeout 60; server数据超时 如果60秒内没有接受到一个字节 连接关闭
    }
}


负载均衡器
upstream 负载均衡集体名字 {
    负载均衡算法
    server 被代理的ip:端口 weight=1(加权轮询 与其他weight配合 按=后的数值比例轮询) down(该机不参与负载) backup备份(热备替补 热备不参与轮询 非热备机器故障 热备机器会替补)
    server 被代理的ip:端口 weight=1
 }
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://负载均衡集体名字;
    }
}


负载均衡算法
轮询 每个请求按时间顺序逐一分配到不同的后端服务器
ip_hash 每个请求按访问的ip的hash结果分配 同一个ip客户端固定访问一个后端服务器
url_hash 按url的hash结果来分配请求 使每个url定向到同一台后端服务器
fair 更加只能的负载均衡算法 可以根据后端服务器的响应时间 加载时间 压力 来分配 nginx需要下载 upstream_fair模块
OSI是一个开放性的通行系统互连参考模型
共包含七层协议
物数网传会表应 
Nginx会话保持
Nginx 动静分离
配置子文件格式
upstream 动态资源名字 {
    server ip 条件;
}
upstream 静态资源名字 {
    server ip 条件;
}
     server {
        listen 80; 跟端口
        server_name localhost;
        location ~ \.(php|jsp)$ {
            proxy_pass http://动态资源名;
            跟条件;
            }
        location ~ .*\.(html|gif|jpg|png|bmp|swf|css|js)$ {
            proxy_pass http://静态资源名;
            跟条件;
            }
静态端配置
子配置文件下
server {
    listen 80;
    server_name localhost;
    location ~ \.(html|jpg|png|js|css|gif|bmp|jpeg) {
        root    跟路径;
        index    跟默认文件;
        }
    }
动态端配置
子配置文件下
server {
    listen 80;
    server_name localhost;
    location ~ \.php$ {
        root 指定网站目录;
        fastcgi_pass 指定端口或指定访问地址;本地路径可以用127.0.0.1回环
        fastcgi_index index.php; 指定默认文件;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 站点根目录 取决于root配置项
        include fastcgi_params; 包含nginx常量定义
        }
    }


nginx防盗链 模块ngx_http_referer_module
1,日志格式里添加$http_referer
2,在子配置文件里server模块里的location模块里 添加
    valid_referers none blocked 跟域名或者IP
        if ($invalid_referer){
            return 403;
            }
valid_referers 白名单 none日志$http_referer有值则拦截 无值则允许 blocked允许不是http://开头的 不带协议的请求访问资源 被防火墙过滤掉的
invalid_referer 无效请求

地址重写 rewrite
相关指令 if rewrite set return
if 语法 if (条件){......}
if 可以匹配的正则表达式
    ~ 正则匹配 区分大小写
    ~* 正则匹配 不区分大小写
    !~ 正则不匹配 区分大小写
    !~* 正则不匹配 不区分大小写
    -f 存在文件 !-f 不存在文件
    -d 判断存在目录
    -e 判断存在文件或者目录
    -x 判断是否可执行


nginx 的全局变量
    $host 请求信息中的Host 如果请求中没有Host行 则等于设置的服务器名
    $request_filename 当前请求的文件路径名(带网站主目录)
    $request_uri 当前请求的文件路径名(不带网站主目录)
rewrite flag
last 把新的地址 返回server重新寻找
break 本条规则匹配完成后 终止匹配 不再匹配后面的规则
redirect 临时重定向
permanent 永久重定向
格式
server {
    listen 80;
    server_name ip;
        location {
        root /html
        index index.html;
        rewrite .* /b/2.html permanent; 重定向配置
        }
        location /b {      下面这个location 为 上面那个重定向的部署位置
        root /html;
        index 2.html;
        }
}

nginx变量规则 set 变量名 变量值   应用环境 server location if
return 用于返回状态码给客户端

location 区段
location 是在server块中配置 根据不同的URL使用不同的配置 来处理不同的请求
location 是有顺序的 会被第一个匹配的location处理
location前缀含义 
    = 表示精准匹配 优先级最高 最低两个location
    ~ 区分大小写的正则匹配 
    ~* 不区分大小写的正则匹配
    / 通用匹配 任何请求都会匹配到 优先级最低
alias 别名定义目录别名


Nginx日志管理
nginx 需要日志模块 ngx_http_log_module 
日志格式通过 log_format 命令定义 nginx 日志包括 access_log rewrite_log error_log
设置访问日志 access_log 路径 命名样式
access_log 作用域有http server location
nginx 日志格式
日志格式通过 log_format命令来定义 需要日志模块ngx_http_log_module  
log_format 自定义格式名 [ip_add:$remote_addr] - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"' '"$http_user_agent" "$http_x_forwarded_for"';
分别为 访问用户的ip - 客户端名称[主机时间] 请求的URL和http协议 访问的状态码 发送给客户端主体内容大小 记录用户从那个页面链接访问过来 记录客户使用的浏览器相关信息 客户浏览器信息 代理服务器ip
access_log 访问日志 指令的作用域有 http server location 设置访问日志格式  access_log 路径 自定义格式名
获取用户IP地址的三个属性的区别 (HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
一、没有使用代理服务 器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理服务器的情 况:Transparent Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

rewrite_log 地址重写日志 
error_log 错误日志 设置错误日志格式 error_log 路径 级别 错误日志级别从低到高有 debug info notice warn error crit alert emerg  只有错误级别高于或者等于设定的级别时 才会写入错误日志
日志轮转次配置文件 /etc/logrotate.d 该目录下有详细的每个应用的日志轮转
/var/log/nginx/*.log { 指定需要轮转的日志文件
    daily     日志文件轮转周期
    missingok 忽略错误信息
    rotate 7 轮转次数 最多七个归档文件 会删除最久的
    minsize 5m 限制条件 大于5m的自动轮转切割
    dateext 以当前日期作为命名格式
    compress 轮询结束后 已归档的日志使用gzip压缩
    delaycompress 与compress 共用 最近一次归档不压缩
    notifempty 日志文件为空 轮询不会执行
    create 640 nginx www-data 新日志文件权限
    sharedscripts 有多个日志熏药轮询时 只执行一次脚本
    }

平滑升级
平滑升级的原理
1,在不停掉老进程的情况下,启动新进程
2,老进程负责处理仍然然没有处理完的请求 但不再接受处理请求
3,新进程接受新请求
4,老进程处理完所有请求后 关闭所有连接 停止
两种需求升级nginx 一种确实需要升级nginx版本 另一种要为nginx添加新的模块
流程
1,查看当前nginx版本和编译参数 用-V显示
2,上传新版本源码包 解压到/usr/local/ 按照原来的编译参数在新版本目录下进行编译nginx 然后make
3,备份原nginx二进制文件 mv   /usr/local/nginx/sbin/nginx   /usr/local/nginx/sbin/nginx_$(date +%F)
4,复制新的nginx二进制文件 进入新的nginx源码包 cp  /usr/local/nginx新版本名称/objs/nginx   /usr/local/nginx/sbin
5,检测新版本nginx是否正常 /usr/local/nginx/sbin/nginx -t
6,给nginx发送平滑迁移信号(若不清楚pid路径 可以查看nginx配置文件)USR2 启动新进程 实现热升级 kill -USR2 `cat /var/run/nginx.pid`
7,查看nginx pid 会出现一个nginx.pid.oldbin   ll /var/run/nginx.pid*
8,关闭旧的Nginx进程   WINCH 逐步关闭工作work进程 kill -WINCH `cat /var/run/nginx.pid.oldbin`
9,HUP 重新加载配置文件 是新的配置启动工作进程 并逐步关闭旧的进程 kill -HUP `cat /var/run/nginx.pid.oldbin`
10,QUIT 等待请求处理结束再退出 kill -QUIT `cat /var/run/nginx.pid.oldbin`

nginx 信号简介
主进程支持的信号
QUIT 等待工作进程结束后再退出
HUP 重新加载配置文件 使用新的配置启动工作进程 并逐步关闭旧进程
USR1 重新打开日志文件
USR2 启动新的主进程 实现热升级
WINCH 不接受新进程 逐步关闭工作进程

Nginx 错误页面配置
error_page 404 403 500 502 503 504 /404.html
    location = /404.html {
    root /usr/local/nginx/html; 指定一个错误页面
    }


nginx 流量控制
好处 可以用来抵御DDOS攻击 减慢暴力密码破解速率 缓解服务器压力
如何进行限制
Nginx 的流量控制 使用 漏桶算法 就好比 一个桶口在倒水 桶底在漏水的水桶 如果桶口倒水的速率大于桶底的漏水速率 桶里面的水会溢出 在请求处理方面 水代表来自客户端的请求 水桶代表先进先出调度算法 等待被处理的请求队列 桶底漏出的水代表离开缓冲区被服务器处理的请求 桶口溢出的水代表被丢弃和不被处理的请求

流量控制配置格式 
limit_req_zone $binary_remote_addr zone=mylimit:10m(桶10m大小) rate=1r/s;(一秒请求一次)
limit_req_zone 指令定义流量限制相关参数 通常在http模块中定义 使其可在多个上下文中使用 它需要以下三个参数:
key 定义应用限制的请求特性 
$binary_remote_addr 保存客户端ip地址的二进制形式 
zone 定义每个IP地址访问频率的内存区域大小 16000个IP地址的状态信息 大约需要1MB
rate 定义最大请求速率

处理冲突 用户请求超过限额 nginx会返回错误 
在limit_req中使用burst参数 

location模块下添加 limit_req zone=mylimit burst=20;
burst 参数定义了超出zone指定速率的情况下 客户还能发多少请求 上一个超出限额的请求将会放入队列 上边示例队列大小为20 

nginx 流量限制日志文件 一般为警告级别
limiting requests 表明日志条目记录的是被流量限制的请求
escess 每毫米超过对应流量限制配置的请求数量
zone定义实施流量限制的区域
client 发起请求的客户端ip地址
server 服务器ip地址或主机名
request 客户端发起的实际http请求
host http报头host的值

nginx 访问控制
基于ip
配置语法 在location模块下添加
拥有优先级 前面的优先级高
allow (允许访问 all为全部 加ip为白名单)
deny (不允许访问 加ip)

基于用户
在http模块里添加或打开 auth_basic string on;
下载 http-tools 服务 
htpasswd -cm /etc/nginx/auth_conf user10 第一次创建用户加c(c创建文件)创建用户user10 并设置密码
编辑配置文件
在location
auth_basic "设置文案";
auth_basic_user_file /etc/nginx/auth_conf; 指定密码用户存储的位置
QPS 每秒请求数 通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了

nginx stub status 监控模块安装
编译命令 ./configure -with-http_stub_status_module
配置文件 server {
        listen 80;
        server_name localhost;
        location /nginx-status {
            stub_status on;
            access_log on;
            }
        }
查看命令 curl localhost/nginx-status

统计uv(用户量) awk '{print $!}' access.log| sort | uniq -c | wc -l
统计pv(访问量) awk '{print $7}' access.log|wc -l
查询访问最频繁的url awk '{print $7}' access.log| sort |uniq -c |sort -n -k 1 -r 
查询访问最频繁的ip awk '{print $!}' access.log|sort |uniq -c |sort -n -k 1 -r

Nginx性能优化
优化思路 当前系统结构瓶颈 了解业务模式 性能与安全
当前系统结构瓶颈 
首先需要了解当前系统瓶颈 用的是什么 跑的什么业务 里面服务是什么样子 每个服务最大支持多少并发
可以通过查看cpu负荷 内存使用率 进程使用率来做判断 也可以通过日志 请求数 握手次数 连接数 压力测试判断性能瓶颈 
了解业务模式
要熟悉业务 了解系统层级结构 对每一层业务进行梳理 每一层做的代理还是动静分离
性能与安全
防火墙等
系统与nginx性能优化
网络(网络质量 是否有丢包 网络的稳定性都会影响用户请求)
系统(系统负载 饱和 内存使用率 系统的稳定性 磁盘是否有损坏)
服务(连接优化 内核性能优化 http服务请求优化)
程序(接口性能 处理请求速度 程序的执行效率 cpu的亲和性)
数据库 底层服务

文件句柄 文件句柄相当于一个文件的索引 会随着请求量和调用频率的增加而增加 会产生更多的句柄 操作系统默认的文件句柄为1024个句柄
配置 vim /etc/security/limits.conf
添加 root(指定用户 *代表所有)sort(提醒 不会强行限制) nofile 65535(句柄数)
        root(指定用户 *代表所有)hard nofile 65535(句柄数)

进程局部性修改 http模块下加 worker_rlimit_nofile 65535;(限制进程 设置最大进程数)
    在events模块下添加 worker_connections 1024;  (限制连接数 最大连接数)
cpu亲和设置
cpu亲和设置 能够使nginx对于不同的work工作进程绑定到不同的cpu上面去 可以减少在work间不断切换cpu 查看cup核心数 cat /proc/cpuinfo|grep"cores"|uniq
查看cpu使用率 top回车按1
配置worker_processes  vim /etc/nginx/nginx.conf
        在http模块下添加
        worker_processes 4指定核数
        worker_cpu_affinity 1010 0101(1代表开启 0代表关闭 1010的数量对应核数 加auto为自动)

https 是 http+ssl/tls https 的安全基础是ssl 
浏览器先读取证书中 证书所有者 有效期等信息进行校验 
浏览器开始查找自己操作系统内内置的证书发布机构ca 与服务器发来的证书进行比对 用于校验证书是否合法
如果找不到 浏览器会报错 说明发来的信息是不可靠的
如果找到 浏览器会从操作系统中取出颁发者ca的公钥 然后对服务器发来的证书里面的签名进行解密
浏览器使用相同的hash算法计算出服务器发来证书的hash值 将这个计算的hash值与证书签名做对比
对比结果一致 则证明服务器发来的证书合法
此时浏览器读取服务端证书的公钥 用于后续加密
client 与 web 协商对称加密算法 client生成一个对称加密密钥并使用web公钥加密 发给web服务器 web服务器使用web私钥进行解密
使用对称加密密钥传输数据 并校验数据的完整性

Nginx 会话保持
会话保持分为 ip_hash sticky_cookie_insert jvm_route
ip_hash 使用原地址哈希算法 将客户端请求发往同一个后端服务器 除非该服务器不可用
sticky_cookie_insert 与ip哈希类似 只不过是基于cookie来判断 可以避免ip哈希中来自同一客户端的失衡情况
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    sticky_cookie_insert srv_id expires=ih(会话保持一小时) doain=3evip.cn path=/;
}
下面server模块 指定的name需要为 3evip.cn
expires:设置浏览器中保持cookie的时间
domain:定义cookie的域
path:为cookie定义路径
jvm_route 一开始请求没有带session信息 jvm_route就根据轮询方法 发到一台tomcat上面
    tomcat会添加上session信息 并返回给客户 用户再次请求 jvm_route看到session中有后端服务器的 
名称 就把它的请求 转到对应的服务器上


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值