Nginx基础知识和自我总结

Nginx

一、概述

1. 什么是 nginx

Nginx 是高性能的 HTTP和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验。

2. 正向代理:客户端 <一> 代理 一>服务端

是一个位于客户端和原始服务器(originserver)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理

  • 正向代理的用途:
    1. 访问原来无法访问的资源,如内网环境资源;
    2. 可以做缓存,加速访问资源
    3. 客户端访问授权,上网进行认证
    4. 记录用户访问记录(上网行为管理),对外隐藏用户信息

3. 反向代理:客户端 一>代理 <一> 服务端

暴露代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

  • 反向代理的作用:
    1. 保证内网的安全,阻止web攻击。
    2. 隐藏后端服务器的信息,屏蔽黑名单中的 IP。
    3. 负载均衡,通过反向代理服务器来优化网站的负载
    4. 提高可扩展性和灵活性。客户端只能看到反向代理服务器的IP,可以增减服务器或者修改它们的配置。
    5. 缓存、静态(HTML/CSS/JS)内容直接返回。
总结理解
区别
  • 自我理解
    正向代理是客户端的,客户端需要配置才可以使用正向代理,是通过代理服务器访问另一个服务器,类似跳板机。即真正被访问的服务器不知道谁真正请求了自己,只清楚代理服务器。
    反向代理是服务端的,即客户端不清楚自己具体访问哪一台服务器,只知道代理服务器。
    从不同角度看而已。类似支付宝付款码支付(被扫)和扫码支付(主扫)。

  • 图示
    image

正向代理中,proxy和client同属一个LAN,对server透明(server不知道谁访问了你)
反向代理中,proxy和server同属一个LAN,对client透明(client不知道访问的具体是谁)

4. 负载均衡

增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,即为负载均衡。

5. 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

二、linux安装Nginx

yum安装

  1. 添加源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  1. 安装Nginx
      通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
yum install -y nginx
  1. 启动Nginx并设置开机自动运行
systemctl start nginx.service
systemctl enable nginx.service
  1. 测试效果
    NF6pCt.png

  2. 查看安装目录

 rpm -ql nginx

基本命令

1、查看 nginx 版本号

./nginx -v
nginx -v

2、启动 nginx

./nginx
systemctl start nginx.service 

3、停止 nginx

./nginx	-s	stop
systemctl stop nginx.service 

4、重新加载 nginx

./nginx -s reload

5、重启 nginx

systemctl restart nginx.service 

6、其他命令

//设置开机自启动
systemctl enable nginx.service
//停止开机自启动
systemctl disable nginx.service
//查看状态
systemctl status nginx.service
ps -ef | grep nginx
//检验配置文件
./nginx -t

三、Nginx配置文件-

nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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"';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

第一部分:全局块-配置服务器整体运行的配置指令

比如 worker_processes 1;
处理并发数的配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

第二部分:events块-影响 Nginx 服务器与用户的网络连接

比如 worker_connections 1024; 支持的最大连接数为 1024;
部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http块☆-套娃完事
  • http 全局块
    http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
  • server 块
    与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的(就是套娃)。
    每个 http 块可以包括多个 server 块,而每个server块就相当于一个虚拟主机
    每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块
    1. 全局 server 块
      最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
    2. location 块
      一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
location 指令说明

用于匹配 URL。

语法:
location [=|~|~*|^~] /uri/ {
… 
}

1、= :表示精确匹配,用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:正则匹配,用于表示 uri 包含正则表达式,并且区分大小写
3、~*:正则匹配,用于表示 uri 包含正则表达式,并且不区分大小写
4、^~:前缀匹配(优先于正则匹配),用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
5、/:通用匹配, 如果没有其它匹配,任何请求都会匹配到

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
匹配顺序

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

(location `=` ) > (location `完整路径` ) > (location `^~` 路径) > (location `~`,`~*` 从上向下正则顺序,匹配在最后一条终止) > (location 部分起始路径) > (`/`)
  • 注意事项:
    1.nginx匹配顺序是先匹配普通location,在匹配正则location;
    2.普通匹配规则无顺序无论写在配置文件的那个地方都一样,但是正则匹配则是按照匹配配置文件中由上到下的先后顺序匹配;

细节

  1. 正则location
    ~ 和 ~
    “~”表示区分大小写;
    “~
    ”表示不区分大小写
  2. 普通location
    除了上面其余全是(包括没有前缀) “=”,“^~”,“@”

^~ 中的“^”表示非;
“~”表示正则,意思为不要继续匹配正则;
“=”也表示阻止正则location;
~”的区别为:“~”依然遵守“最大前缀”匹配;而“=”必须是严格匹配。
“@ ”是用来定义“Named Location ”的(可以理解为独立于“普通location”和“正则location”之外的第三种类型),这种“Named Location ”不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。
注意:这里说的“内部重定向(internally redirected )”是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。

参考博文:
https://www.cnblogs.com/sign-ptk/p/6723048.html
https://www.jianshu.com/p/38810b49bc29

第三、负载均衡配置

upstream 参数-官方文档

参数描述
service反向代理服务地址 加端口(可以是内网域名)
weight权重
max_fails失败多少次 认为主机已挂掉则,踢出
fail_timeout踢出后重新探测时间
backup备用服务
max_conns允许最大连接数
slow_start当节点恢复,不立即加入
  • service
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 配置如下:
upstream myService{
    server 127.0.0.1:8050 ;
    server 127.0.0.1:8060 ;
}
  • weight(权重)
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream myWeight {
    server 127.0.0.1:8050       weight=5;
    server 127.0.0.1:8060       weight=1;
}
  • max_conns
    可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800
upstream myMax_conns {
    server 127.0.0.1:8050    weight=5  max_conns=800;
    server 127.0.0.1:8060    weight=1;
}
  • max_fails、fail_timeout
    max_fails
    失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次
upstream myMax_fails {
//代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复。
    server 127.0.0.1:8050    weight=1  max_fails=1  fail_timeout=20;
    server 127.0.0.1:8060    weight=1;
}

负载均衡算法

  1. 轮询(默认)
  2. 轮询+weight(权重)
  3. ip_hash:基于Hash计算
    对请求IP进行Hash计算,根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处,可以解决session不共享的问题。
  4. url_hash(第三方)
    应用场景: 静态资源缓存,节约存储,加快速度
  5. 最少链接数-least_conn
  6. 最快响应时间-least_time
    最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重。
示意图
  • ip_hash
    image

  • url_hash
    image

  • Nginx执行流程

  1. 客户端请求server_name
  2. 依据负载均衡策略,获得server
  3. 对url进行location匹配
  4. 转发请求,返回资源
    image

参考博文:https://blog.csdn.net/caijunsen/article/details/83002219

配置示例:
//1.加入upstream节点
upstream myServer { 
      server 127.0.0.1:9001; 
      server 127.0.0.2:9002; 
}
//2.将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称
server {
   listen       80;
   server_name  localhost;

  location /  {
        root  html; 
        index  index.html index.htm;
        proxy_pass http://myServer;
   }

}

  • 演示:
    NaoYVS.png

参考博文:https://www.cnblogs.com/wzjhoutai/p/6932007.html

动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。

  • 实现方式:
    一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
    另外一种方法就是动态跟静态文件混合在一起发布,通过nginx location 来分开

通过 location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量;适合不经常变动的资源

NW6Nmd.png

autoindex:是否开启目录浏览

nginx 原理与优化参数配置

NW590S.png

master-workers 的机制的好处
  1. 每个worker是独立的进程,不需要加锁,所以省掉了锁带来的开销。
  2. worker互相之间不会影响。

Nginx 配置高可用的集群

Keepalived+Nginx 高可用集群(主从模式)

image

参考搭建博客:https://www.cnblogs.com/yanjieli/p/10682064.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值