• 01-Nginx基础知识


    一、什么是Nginx

    # nginx 是一个 web服务器 ( 静态资源 )  代理服务器...

    二、Nginx应用场景

    """
    1.web服务器
    2.反向代理 代理服务 ( PHP Python Golang Java )
        2.1) 负载均衡
        2.2) 缓存
            3.安全服务https
    """

    三、Nginx组成结构

    """
    二进制文件:         Nginx主体框架能实现基本的请求与响应功能 ( 源码 + 模块 = 编译 )汽车的基本框架,提供驾驶功能
    nginx配置文件:      控制Nginx的行为,能做什么不能做什么,控制汽车前往的目的地
    access_log日志:    记录每一条用户的http 请求,GPS记录行动轨迹
    error_log日志:     服务无法运行,或出现异常时,可以通过error_log定位故障,黑匣子,分析故障,和定位故障
    """

    1、配置官方yum源

    epel源获取,使用过程中就会出现权限不足的问题

    2、执行命令安装

    [root@kkk-pythonedu ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    [root@kkk-pythonedu ~]# yum install nginx -y
    [root@kkk-pythonedu ~]# rpm -q nginx
    nginx-1.16.1-1.el7.x86_64

    3、安装后的目录结构

    [root@kkk-pythonedu ~]# rpm -ql nginx
    /etc/logrotate.d/nginx            # 日志轮转 ( 日志切割 )
    /etc/nginx/                        # nginx配置文件目录
    /etc/nginx/nginx.conf            # nginx主配置文件
    /var/log/nginx                    # 日志目录 

    4、Nginx配置文件

    [root@kkk-pythonedu ~]# systemctl stop httpd
    [root@kkk-pythonedu ~]# systemctl disable httpd
    [root@kkk-pythonedu ~]# systemctl start nginx
    [root@kkk-pythonedu ~]# netstat -lntp | grep 80
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      26551/nginx: master 

    cat /etc/nginx/nginx.conf

    user nginx;                                         # 运行nginx的用户身份
    worker_processes auto;                              # worker进程运行多少个, auto自动与cpu核心保持一致
    error_log /var/log/nginx/error.log;                 # 错误日志
    pid /run/nginx.pid;                                 # 进程运行后,在该目录下存放一个pid文件,文件中记录的是该进程的ID编号
    
    include /usr/share/nginx/modules/*.conf;            # 包含所有的模块配置文件
    
    events {
        worker_connections 1024;                        # worker的最大连接数   [  worker_connections *  worker_processes ]
    }
    
        
    http {            # 负责http的请求与响应
        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;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;            # 存放的都是nginx能支持的文件类型
        default_type        application/octet-stream;        # 当 nginx 不支持该类型时,默认以下载的方式回传给用户
    
        include /etc/nginx/conf.d/*.conf;                    # 包含conf.d/*.conf结尾的文件    [ 定义的一个又一个的网站 ]
    }

    第一步: 关闭防火墙  

      firewalld
        systemctl stop firewalld
        systemctl disable firewalld
      selinux
        setenforce 0
        sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

    清除nginx.conf中所有的注释,以及server整个段的内容

    第二步:新建一个站点

    # [root@kkk-pythonedu ~]# cat /etc/nginx/conf.d/test.kkk.com.conf
    server {
        listen 80;
        server_name test.kkk.com;
    
        location / {
            root /code/html;
            index index.html;
        }
    }

    根据配置文件定义的路径,创建该路径,并放入代码

    [root@kkk-pythonedu ~]# mkdir /code/html -p 
    [root@kkk-pythonedu ~]# echo "test-kkk.com....." > /code/html/index.html

    检查配置文件是否有错误的地方

    [root@kkk-pythonedu ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    重载服务,并生效

    [root@kkk-pythonedu ~]# systemctl restart nginx    

    配置Hosts解析  ( 假的域名  )

    Windows:  C:WindowsSystem32driversetc
                10.0.0.201 test.kkkedu.com
    
    MacOS:    /etc/hosts
                10.0.0.201 test.kkk.com

    5、服务器在新增一个游戏的站点

    nginx.conf 主配置文件一般不动

    [root@kkk-pythonedu ~]# cat /etc/nginx/nginx.conf
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        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;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        include /etc/nginx/conf.d/*.conf;
    }

    第一步、编辑nginx配置文件

    [root@kkk-pythonedu ~]# cat /etc/nginx/conf.d/game.kkkedu.com.conf

     server {
       listen 80; # 监听的端口
       server_name game.kkkedu.com; # 申明域名

       location / { # 匹配用户请求的uri路径
       root /code/html; # 告诉 nginx 站点的代码在哪里目录下
       index index.html index.htm; # 定义 默认返回的主页面
     }

    第二步、根据配置,创建目录,上传代码

    [root@kkk-pythonedu ~]# mkdir /code/game -p
    [root@kkk-pythonedu ~]# cd /code/game/
    [root@kkk-pythonedu game]# rz
    [root@kkk-pythonedu game]# unzip html5_(1).zip 

    第三步、检查nginx配置文件语法,然后重载服务

    [root@kkk-pythonedu game]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@kkk-pythonedu game]# systemctl restart nginx

    第四步、配置Hosts解析(假的)

    Windows电脑没有Hosts文件,  新建出来.
    
    Windows:  C:WindowsSystem32driversetc
                    10.0.0.200 test.kkkedu.com
                    10.0.0.200 game.kkkedu.com

    5、Nginx整个流程

    """
    1.用户通过浏览器请求game.kkkedu.com   
    2.浏览器会添加一些协议头信息,携带上默认的请求uri,  http://game.kkkedu.com/
    3.浏览器会发起DNS解析,解析game.kkkedu.com  对应的真实IP地址   
    4.浏览器获取到真实的IP地址后,  通过  IP+Prot的方式请求应用程序Nginx
    5.Nginx接受到请求后,会进行事件的处理, 将用户请求的 Request 信息中 包含的 Host 字段, 与 Server_name 字段进行匹配
        5.1) 如果匹配不成功,则会随机返回一个站点的页面给用户.
        5.2) 可以通过 在 listen 80 default_server; 方式来定义具体默认返回哪个站点给用户.
        5.3) 如果碰到非法的域名,可以拒绝,也可以做跳转.
                拒绝:
                    return 500;
                跳转:
                    return 302 https://www.jd.com;
    6.如果匹配成功, 接下来进行location uri地址匹配, 获取要返回的文件所在的路径 + 默认返回的页面 
    7.Nginx获取磁盘上的文件, 然后构建响应报文,回传给浏览器,浏览器加载并且渲染最终的结果呈现给用户.
    """

     四、Nginx基础模块

    1、目录索引 auto_index

    能实现和阿里云mirrors.aliyun.com  一样的效果.

    [root@kkk-pythonedu ~]# cat /etc/nginx/conf.d/mirror.kkkedu.com.conf
    server {
        listen 80;
        server_name mirror.kkkedu.com;
        charset utf8;
    
        location / {
            root /code/mirror;
            autoindex on;                    # 开启目录索引功能
            autoindex_exact_size off;        # 显示文件具体大小
            autoindex_localtime on;          # 显示本地服务器时间 
        }
    }
    [root@kkk-pythonedu ~]# nginx -t
    [root@kkk-pythonedu ~]# systemctl restart nginx
    
    [root@kkk-pythonedu ~]# mkdir -p /code/mirror
    [root@kkk-pythonedu ~]# cd /code/mirror 
    [root@kkk-pythonedu ~]# rz

    1.1、访问限制

    给予来源IP限制

    """
    1) 仅允许 10.0.0.1 访问,其他访问全部拒绝
    
    server {
        ...
        allow 10.0.0.1/32;
        deny all;
        ...
    }
    
    2) 拒绝10.0.0.1 访问, 其他全部允许
    
    server {
        ...
        deny 10.0.0.1/32;
        allow all;
        ...
    }
    """

    测试的curl命令:
    [root@kkk-pythonedu mirror]# curl -HHost:mirror.kkkedu.com http://10.0.0.200/

    1.2、基于用户与密码 auth_basic_module

    [root@kkk-pythonedu ~]# yum install httpd-tools -y
    [root@kkk-pythonedu nginx]# htpasswd -c -b password_file kkk 123
    [root@kkk-pythonedu nginx]# cat password_file 
    kkk:$apr1$7dYbXvco$LSJaBM3HqlK3k1kkRt2Ya.

    nginx配置文件:

    server {
        listen 80;
        server_name mirror.kkkedu.com;
        charset utf8;
    
        auth_basic "hello,nginx";                # 描述信息
        auth_basic_user_file password_file;        # 定义密码文件名称
    
        location / {
            root /code/mirror;
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
        }
    }

    1.3、登录后work需要密码 、public无需密码

    [root@kkk-pythonedu ~]# mkdir /basic/{work,public} -p
    [root@kkk-pythonedu mirror]# cat /etc/nginx/conf.d/basic.kkkedu.com.conf 
    server {
        listen 80;
        server_name basic.kkkedu.com;
        root /basic;
        autoindex on;
    
        location / {
        }
    
        location /work {
            auth_basic "test_work";
            auth_basic_user_file password_file;
        }
    }
    [root@kkk-pythonedu mirror]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@kkk-pythonedu mirror]# systemctl restart nginx

    点击public

    点击work

    1.4、限制链接 limit_conn

    场景: 下载

    [root@kkk-pythonedu mirror]# cat  /etc/nginx/conf.d/mirror.kkkedu.com.conf 
    limit_conn_zone $binary_remote_addr zone=addr:10m;            # 定义限制的key, 分配区域大小
    server {
        listen 80;
        server_name mirror.kkkedu.com;
        charset utf8;
        limit_conn addr 1;            # 调用区域限制,限制key只可以出现1次, 相当于限制来源客户端IP的连接数为1
        limit_conn_status 500;        # 限制成功后,会返回500的错误状态码,默认返回503
        
        limit_rate_after 200m;        # 全速下载200m资源
        limit_rate       300k;        # 达到200m以后,限制300k的速度
    
        error_page 500 = @testerror;    # 如果 出现500错误,则让其跳转到内部的 @testerror 
        
        location @testerror {            # 定义 @testerror, 返回具体的动作 
            default_type text/html;
            return 200 '$remote_addr 你超过了最大连接限制, 请充值VIP解封!';
        }
        location / {
            root /code/mirror;
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
        }
    }

    1.5、状态监控 stub_status

    location = /status {
        stub_status;
    }
    """
    Active connections: 2                 
    server accepts handled requests
     74 74 104 
    Reading: 0 Writing: 1 Waiting: 1 
    
    
    Active connections: # 活跃的连接数
    accepts:             # 接受的总TCP连接数
    handled:             # 总处理的TCP连接数
    requests:             # 总的 http 请求数
    """
  • 相关阅读:
    [译]WCF RIA Services中的集合(2)
    Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)
    记录来敦煌一周的情况
    Silverlight通过MVVM实现多语言实时切换(含源代码)
    [译]WCF RIA Services中的集合(1)
    Silverlight Client←→Server数据同步备忘代码
    Siverlight5新功能/改进总结
    Expression Blend 5 Preview For Silverlight5 RC已发布
    你应该知道的,那些未在Silverlight5Beta中出现的特性
    .NET数据库编程求索之路1.引子
  • 原文地址:https://www.cnblogs.com/kongxiangqun/p/13810285.html
Copyright © 2020-2023  润新知