nginx

作者: 天生顽皮 | 来源:发表于2021-05-10 22:40 被阅读0次

    三大功能

    1.网页服务:自身是静态web服务,还支持动态web服务
    {PHP(fastcgi_pass)}
    {JAVA(proxy_pass)}
    {Python(uwsgi_pass)}
    ===================================
    apache   lighttpd   iis
    2.负载均衡\反向代理
    haproxy  lvs  F5  netscaler
    3.缓存服务器
    squid    varnish
    

    特点

    静态小文件高并发,占用资源少。软件本身小

    Nginx HTTP服务器的特点及优点

    1.支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
    2.资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200Mb内存
    3.可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,相当于专业的haproxy软件或LVS的功能
    
    ##1.Nginx作为web服务器的主要应用场景
    

    1.静态web服务器:
    使用Nginx运行HTMl、JS、css、小图片等静态数据
    2.配合运行动态web服务器


    image.png

    3.反向代理/负载均衡
    http负载均衡
    4.做web缓存服务器(把文件放入内存里)

    5.反向代理与负载均衡
    代理:海外代购,微商:代理:代替别人做事
    
    正向代理:由内向外,请求外部应用服务
    代替局域网内PC,请求外部应用服务
    
    反向代理:由外向内    代题   效率低
    代替外部的应用  请求内部的应用服务器。
    
    
    
    负载均衡:转发、效率高
    甩手掌柜
    
    6.为什么Nginx总体能比Apache高?
    image.png image.png

    1.安装nginx的方法

    配置本地的nginx源码
    vim   /etc/yum.repo.d/nginx.repo
    写入
    [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
    
    
    yum   install   nginx
    
    检查是否可用   百度查看装有nginx服务的ip
    
    1.1nginx主要配置文件(yum 1.20.0)
    [root@web01 ~]# cat  /etc/nginx/nginx.conf 
    
    user  nginx;               #nginx运行的用户
    worker_processes  auto;        #worker 进程数量(处理用户请求)    
    
    error_log  /var/log/nginx/error.log notice;        #error_log错误日志   notice错误级别
    pid        /var/run/nginx.pid;             #nginx pid文件位置
    
    
    events {               #events {模块/区域
        worker_connections  1024;       #每个worker进程的连接数(并发)
    }
    
    
    http {                                   #http区域/模块  web服务
        include       /etc/nginx/mime.types;       #媒体类型(文件类型)  Include引用或包含其他地方配置
        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"';    #指定nginx访问日志的格式   log_format   格式名称 详细定义
    
        access_log  /var/log/nginx/access.log  main;   # access_log 指定日志的位置及格式
    
        sendfile        on;                       #开启一个高效的传输模式
        #tcp_nopush     on;            #
    keepalive_timeout  65;           #超时时间
    
        #gzip  on;                    #是否开启gzip压缩 静态文本内容  节省带宽
    
        include /etc/nginx/conf.d/*.conf;     #引用conf.d/*.conf结尾的文件   网站站点配置文件
    }
    
    
    image.png

    1.2nginx编译安装

    1. mkdir    /app
    2. cd        /app
    3. wget     http://nginx.org/download/nginx-1.20.0.tar.gz
    4. 安装依赖   yum -y install gcc make wget pcre-devel zlib-devel
    5. 解压   tar   xf   nginx-1.20.0.tar.gz
    6. cd    nginx-1.20.0
    7.执行指定路径                      ./configure   --prefix=/app/code  
    8.创建软链接    ln  -s   /app/code/sbin/nginx    /sbin/ngin
    9.开启测试    nginx     上百度输入ip地址显示      Welcome to nginx
    10创建用户   useradd   -s   /sbin/nologin  -M    -u     888  www 
    11.添加到root组     usermod    -g    root    www
    12.修改配置文件     vim   /app/code/conf/nginx.conf
    user  www;                                              名称
    server_name  www.dwg.com;                 访问的网站
                root   /app/game;                         访问的目录
    13.修改linux中的hosts文件    
    vim  /etc/hosts 
    172.16.1.8     www.dwg.com
    14.修改计算机中的hosts文件解析
    15.重启   nginx      输入nginx
    

    1.3yum直接安装nginx

    yum   install   -y   nginx
    

    2.nginx目录结构

    image.png

    3.简单使用nginx

    systemctl     start    nginx       临时启动nginx
    systemctl     enable  nginx     开机自启nginx
    
    #检查端口  
     ss   -lntup   |grep   nginx
    tcp LISTEN 0 128 *:80
    *:* users:
    (("nginx",pid=11746,fd=6),("nginx",pid=11745,fd=6))
    #检查进程
    ps   -ef   |grep    nginx
    root 11745 1 0 11:45 ? 00:00:00
    nginx: master process /usr/sbin/nginx -c
    /etc/nginx/nginx.conf
    nginx 11746 11745 0 11:45 ? 00:00:00
    nginx: worker process
    root 11790 11262 0 11:45 pts/0 00:00:00 grep
    --color=auto nginx
    #检查nginx是否可用
    linux中    curl    10.0.0.7
    windows中     网页搜索  10.0.0.7
    #上线代码
    1.创建game目录
    2.上传到 /usr/share/nginx/html/game
    3.解压代码并删除压缩包
    4.浏览器访问http://10.0.0.7/game/
    

    4.nginx配置文件

    /etc/nginx/nginx.conf
    image.png

    5.nginx虚拟配置主机

    image.png

    5.1.基于域名的虚拟主机

    1.改配置   把原有的配置文件全部打包
    #/code/game index.html 内容 game.liu.com
    #/code/www index.html 内容 www.liu.com
    
    $cd   /etc/nginx/conf.d
    $vim   liu.conf
    
    ==> www.liu.com <==
    server  {
    listen  80;
    server_name  www.liu.com;
    location  /   {
    root   /code/www;
    index   index.html;
      }
    }
    ==> game.liu.com <==
    server  {
    listen  80;
    server_name  game.liu.com;
    location  /   {
    root   /code/game;
    index   index.html;
      }
    }
    2.测试配置与重启nginx     一定要做windows中的hosts解析
    nginx   -t    显示ok配置正确
    systemctl    start   nginx
    3.创建目录 
    mkdir   -p   /code/{game,www}
    给/code/www/index.html 和/code/game/index.html中增加东西
    echo   ‘我收下了’    >>/code/www/index.html
    4.做解析,做检查
    [root@web01 /etc/nginx/conf.d]# curl www.liu.com
    www.oldboy.com
    [root@web01 /etc/nginx/conf.d]# curl game.liu.com
    game.oldboy.com
    

    5.2基于ip虚拟机

    1.添加ip地址
    ip addr add 10.0.0.100/24 dev eth0 label eth0:0
    2.修改配置文件
    ==> www.liu.com <==
    server  {
    listen     10.0.0.100:80;
    server_name  www.liu.com;
    location  /   {
    root   /code/www;
    index   index.html;
      }
    }
    ==> game.liu.com <==
    server  {
    listen     10.0.0.7:80;
    server_name  game.liu.com;
    location  /   {
    root   /code/game;
    index   index.html;
      }
    }
    3.检查语法并重启
    nginx   -t
    systemctl   restart   nginx
    4.测试
    curl
    

    5.3基于端口虚拟机

    1.修改配置文件基于端口
    ==> www.liu.com <==
    server  {
    listen     80;
    server_name  www.liu.com;
    location  /   {
    root   /code/www;
    index   index.html;
      }
    }
    ==> game.liu.com <==
    server  {
    listen     81;
    server_name  game.liu.com;
    location  /   {
    root   /code/game;
    index   index.html;
      }
    }
    2.检查语法并重启
    nginx   -t
    systemctl  reload   nginx
    3.检查端口是否开启
    ss   -lntup  |grep  nginx
    4.测试
    crul   http://10.0.0.100:81
    

    6.nginx日志详解

    **访问日志 : /var/log/nginx/access.log
    **错误日志 : /var/log/nginx/error.log
    **访问日志的格式: log_format 设置 nginx访问日志的格式
    **设置(开启)访问日志 access_log

    6.1log_format日志格式

    image.png
    log_format main '$remote_addr - $remote_user
    [$time_local] "$request" '
    '$status $body_bytes_sent
    "$http_referer" '
    '"$http_user_agent"
    "$http_x_forwarded_for"';
    $remote_addr #客户端ip地址
    $remote_user #远程用户(空)
    $time_local #时间 11/May/2021:10:26:41
    +0800
    
    
    $request #用户请求报文的起始行 "GET
    /index.html HTTP/1.1"
    $request_uri #用户请求的uri
    $status #状态码
    $body_bytes_sent #http响应报文的主体大小(文件大小) 字
    节 (服务器给你发送了1个多大的文件)
    $http_referer #从哪里跳转到你的网站 (从哪里跳转)
    分析用户的来源,精确投放广告(sem)
    $http_user_agent #用户的代理(浏览器)
    $http_x_forwarded_for #记录用户真实ip地址(讲解负载均衡再
    说)
    

    6.2access_log访问日志设置

    image.png
    path是路径
    format 日志格式
    gzip是否压缩 注压缩后日志最好命名为access.log.gz
    fush 定时更新
    
    #应用案例: 指定位置及格式
    access_log /var/log/nginx/access.log main;
    
    #应用案例: 压缩 日志先写入到缓存 每隔3s写入到磁盘
    [root@web01 /etc/nginx/conf.d]# cat www.oldboy.com.conf
    server {
    listen 80;
    server_name www.oldboy.com;
    access_log /var/log/nginx/www_access.log.gz main
    gzip buffer=128 flush=3;
    location / {
    root /code/www;
    index index.html;
    }
    }
    #
    

    6.3错误日志格式

    image.png
    level #日志格式
    debug #最详细
    notice #
    error #等等
    

    6.4日志切割

    #日志切割: 定期把切割成一个新的文件(加上日期). 避免日志过大
    #如何实现:
    ##logrotate 命令 + /etc/logroate.d/配置文件
    logroate -f /etc/logroate.d/nginx
    [root@web01 /etc/nginx/conf.d]# cat
    /etc/logrotate.d/nginx
    /var/log/nginx/*.log { #指定你要切割的文件
    daily #每天
    missingok #如果对应日志不存在,跳过,不
    显示错误信息
    rotate 52 #最多保留多少个切割后的日
    志.
    compress #日志是否压缩 gzip
    delaycompress #延迟一个周期,然后在进行压
    缩
    notifempty #not if empty 如果日志是
    空的跳过.
    create 640 nginx adm #日志权限,所有者
    sharedscripts #
    postrotate #在日志轮询(切割)之后,执行
    里面的命令
    if [ -f /var/run/nginx.pid ]; then
    kill -USR1 `cat
    /var/run/nginx.pid` #systemctl reload nginx
    fi
    endscript
    }
    

    7.nginx处理请求处理过程

    1. 用户输入url域名
    2. DNS解析:查找域名对应的ip地址(获得域名对应的ip地址)
    3. tcp3次握手:用户通过ip地址与对应的服务器建立连接(与服务器连接)
    4. http请求报文(豹纹):建立tcp连接后,用户向服务器索要指定的内容(页面,

    图片,视频....) (向服务索要内容)

    5. 服务器通过查找 (nginx如何处理请求)
    6. http响应豹纹: 找到后把用户要的内容,返还给用户(服务型响应用户)
    7. tcp4次挥手: 用户与服务器断开连接
    #1 . nginx处理用户请求流程
    https://www.processon.com/view/link/609a2aeee401fd45927
    54f39
    #2. 使用ip或未注册的域名访问流程 和 如何限制 www.oldboy.com
    bbs.oldboy.com blog.oldboy.com game.oldboy.com
    aaa.oldboy.com ---> 网站
    #3. url--->找出文件在服务器的位置?
    https://img10.360buyimg.com/imgzone/jfs/t1/64309/10/139
    28/244846/5db65b36E92ff53eb/38c9d4cea3e94b98.jpg
    img10.360buyimg.com---> 域名对应的server
    根据uri
    /imgzone/jfs/t1/64309/10/13928/244846/5db65b36E92ff53eb
    /38c9d4cea3e94b98.jpg 配合站点目录(root) 进行查找 .
    

    8.nginx常用模块

    8.1autoindex 目录索引模块

    autoindex_module
    autoindex 是否开启目录索引功能
    autoindex_exact_size 是否以人类可读形式显示大小(off), on(精确显示)
    autoindex_format html /json
    autoindex_localtime
    8.1.1配置一个下载目录
    编辑配置文件
    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
           root   /code/www;
        }
    }
    ###注意在/code/www;目录中一定不要存在index.html
    

    8.1.2配置一个查看nginx状态的目录

    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
        root   /code/www;
        }
        location   /status {
        stub_status;
        access_log  off;
        }
    }
    
    image.png

    8.2访问限制-allow-deny

    ngx_http_access_module 访问限制模块
    allow 准许 某个ip或网段访问
    deny 拒绝
    使用allow和deny 完成白名单和黑名单功能
    白名单: allow,deny常用,用来限制核心目录,文件,禁止外界访问
    黑名单:deny, 屏蔽ip地址
    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
        root   /code/www;
        }
        location   /status {
        stub_status;
        access_log  off;
        allow  10.0.0.7;
        }
    }
    只允许10.0.0.7访问,也就是只能在linux中访问,可以去百度验证。
    

    8.3auth_basic_user用户授权模块

    ngx_http_auth_basic_module
    限制用户访问,访问的时候输入用户名和密码
    image.png
    image.png
    #让用户访问www.liu.com/status 需要输入用户密码
    1.创建nginx auth_basic_user_file 需要的密码文件
    先安装插件 yum install  -y  httpd-tools
    创建密码文件 htpasswd  -b  -c  /etc/nginx/conf.d/status.pass     liu   123456
    修改密码文件权限为600 chmod  600  /etc/nginx/conf.d/status.pass
    修改密码文件的属主为nginx   chown  nginx   /etc/nginx/conf.d/status.pass
    
    #修改配置文件
    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
        root   /code/www;
        }
        location   /status  {
        stub_status;
        auth_basic   "status";
        auth_basic_user_file  /etc/nginx/conf.d/htpasswd.pass;
        }
    }
    重启服务并测试
    systemctl    reload    nginx   
    curl -u  liu:123456  www.liu.com/status 
    

    8.5各种模块限制

    limit_req 模块 限制请求(http)
    limit_conn 模块 限制连接(tcp)
    limit_rate core模块 限速速度

    8.5.1limit_req 请求限制模块

    limit_req用于限制每个已定义密钥的请求处理速率,特别是来自单个IP地址的请求的处理速率。限制是使用“漏桶”方法完成的。
    image.png

    配置文件

    http {
    limit_req_zone $binary_remote_addr zone=one:10m 
    rate=1r/s;
          }
    #$binary_remote_addr 用户ip地址,占用空间更少
    #zone=One:10m   指定空间名字:大小
    #rate=1r/s       指定木桶处理速度
    ![image.png](https://img.haomeiwen.com/i26205174/ad8b9d506aef681a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    limit_req zone=one burst=5;
    zone=one   #指定limit_req_zone 创建的木桶空间
    burst=5    #并发5
    
    
    配置文件
    limit_req_zone $binary_remote_addr zone=one:10m 
    rate=1r/s;
    server {
       location /search/ {
           limit_req zone=one burst=5;
       }
    
    #平均每秒允许不超过1个请求,突发请求不超过5个。
    
    
    limit_req_zone $binary_remote_addr zone=one:10m 
    rate=1r/s;
    server {
       location /search/ {
           limit_req zone=one burst=5 nodelay;
       }
    
    #nodelay #默认不加上nodelay,超过并发数后,排队(delay)nodelay超过并发数后,报错
    

    8.5.2limit_conn 连接数限制模块

    基于ip限制每个ip地址的连接数量.
    1.ngx_http_limit_conn模块用于限制每个已定义密钥的连接数,特别是来
    自单个IP地址的连接数。
    2.并非所有连接都被计算在内。只有当一个连接有一个正在由服务器处理的请求
    并且整个请求头已经被读取时,它才会被计数。
    
    image.png
    image.png
    配置文件
    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
        root   /code/www;
        }
        location   /status  {
        stub_status;
        auth_basic   "status";
        auth_basic_user_file  /etc/nginx/conf.d/htpasswd.pass;
        limit_conn  addr 1;
    
        }
    }
    

    8.5.3 limit_rate 速率限制

    limit_rate 限速
    limit_rate_after 下载多少文件后再进行限速
    image.png
    1.环境准备
    dd  if=/dev/zero  of=/code/share/vsecret.avi  bs=1M 
    count=500
    2.配置文件
    server {
        listen    80;
        server_name   www.liu.com;
        autoindex  on;
        location  /   {
        root   /code/www;
        }
        location   /status  {
        stub_status;
        auth_basic   "status";
        auth_basic_user_file  /etc/nginx/conf.d/htpasswd.pass;
        limit_conn  addr 1;
        limit_rate_after   50m;
        limit_rate  200k;
        }
    }
    

    9.location 功能

    主要匹配用户请求中的uri

    image.png
    image.png
    image.png
    #图片
    location ~*   \.(jpg|png|bmp|jpeg|gif|img)$ {
    缓存
    }
    配置
    server {
       listen 80;
       server_name location.oldboy.com;
       location / {
           default_type text/html;
           return 200 "location /";
       }
       location =/ {
           default_type text/html;
           return 200 "location =/";
       }
       location ~ / {
           default_type text/html;
           return 200 "location ~/";
       }
    测试
    [root@web01 /etc/nginx/conf.d]# curl -H 
    Host:location.oldboy.com 10.0.0.7 
    location ~*/[root@web01 /etc/nginx/conf.d]#
    

    location 应用场景

    # 通用匹配,任何请求都会匹配到
    location / {
       ...
    }
    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
       ...
    }
    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
       ...
    }
    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条
    location
    location ~* .*\.(jpg|gif|png|js|css)$ {
        #缓存
    }
    # 不区分大小写匹配
    # 通用匹配,任何请求都会匹配到
    location / {
       ...
    }
    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
       ...
    }
    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
       ...
    }
    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条
    location
    location ~* .*\.(jpg|gif|png|js|css)$ {
        #缓存
    }
    # 不区分大小写匹配
    # 通用匹配,任何请求都会匹配到
    location / {
       ...
    }
    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
       ...
    }
    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
       ...
    }
    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条
    location
    location ~* .*\.(jpg|gif|png|js|css)$ {
        #缓存
    }
    # 不区分大小写匹配
    # 通用匹配,任何请求都会匹配到
    location / {
       ...
    }
    
    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
       ...
    }
    
    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
       ...
    }
    
    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条
    location
    location ~* .*\.(jpg|gif|png|js|css)$ {
        #缓存
    }
    
    # 不区分大小写匹配
    location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
     return 403;
    }
    

    10.goaccess

    10.1日志分析工具

    日志分析工具:
    matomo (piwiki) lnmp
    awstat (perl)
    goaccess 
    Elastic (ELK) Stack
    
    #1.环境搭建
    wget     http://tar.goaccess.io/goaccess-1.2.tar.gz
    tar xf goaccess-1.2.tar.gz
    安装依赖
    yum install -y GeoIP-devel
    yum install -y ncurses-devel
    
    cd goaccess-1.2/
    ./configure --enable-utf8 --enable-geoip=legacy
    make
    make install
    
    2.测试  
    goaccess  -f   /var/log/nginx/access.log
    html方式显示
    goaccess -f   /var/log/nginx/access.log-20210512 -o     /code/log/report.html
    

    10.2goaccess

    -f 指定日志文件

    -p 指定配置文件(html页面显示使用)

    10.3选择日志格式

    image.png
    image.png

    相关文章

      网友评论

          本文标题:nginx

          本文链接:https://www.haomeiwen.com/subject/lfdpdltx.html