• nginx基础


    Nginx基础

    学习完了nginx的一些基础知识,写篇博客做个笔记,方便以后复习,本篇博客在晚上精神不佳是所写,可能会有拼写错误,

    对于服务端大佬如果看到这篇想解决问题,请出门右转,因为太基础我还是一个nginx初学者,如果大佬愿意看我的这篇文章,我再辞抱拳感谢,也十分欢迎看到这篇文章的人给我这个nginx初学者提出宝贵的建议,十分感谢!!()

    nginx的中间架构

    多路复用

    多个描述符的io操作都能在一个线程内完成并发的交替的顺序完成,这就叫io多路复用,这里的‘复用’指的是复用同一个线程

    什么是select

    缺点:能够监视的文件描述符的数量存在最大限制,线性扫描效率低下

    epoll模型

    每当FD就绪,采用系统的回调函数之间将fd放入,效率更高,最大连接无限制

    nginx十分轻量级,代码模块化,功能模块少,与cpu亲和

    为什么要与cpu亲和?

    cpu亲和就是一种把cpu核心和nginx工作进程绑定的方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能

    nginx的sendfile


    初学nginx,对许多概念都还不理解,反正nginx很好就对了,虽然以前没apache牛X,但现在应该赶得上apache了

    搭建环境

    nginx具体介绍:Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡

    优点:

    • 支持海量高并发:采用IO多路复用epoll。官方测试Nginx能够支持5万并发链接,实际生产环境中可以支撑2-4万并发连接数。
    • 内存消耗少:在主流的服务器中Nginx目前是内存消耗最小的了,比如我们用Nginx+PHP,在3万并发链接下,开启10个Nginx进程消耗150M内存。
    • 免费使用可以商业化:Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可以用于商业。
    • 配置文件简单:网络和程序配置通俗易懂,即使非专业运维也能看懂。

    emmm...,其实也不算是初学,不然怎么会有现成的环境,以前感兴趣自己打了个环境,没了个域名和服务器,只不过当时知识简单了解了了解,这次我是要比上次学的更加深刻了

    环境搭建很简单,下载nginx,一般的规矩:学习最新版,上线稳定版,我的整个学习完全是基于centos,所以命令少不了,先回忆一下搭建基础环境的命令

    检查yum源:yum list | grep nginx,作用是检查当前版本的操作系统nginx的版本

    nginx是c写的所以一定少不了gccyum -y install gcc gcc-c++ autoconf pcre-devel make automake

    然后既然是在linux上操作,编辑器怎么能缺了vimyum -y install wget httpd-tools vim

    最后一切就绪,点火:yum install nginx

    如果当前linux上yum源的nginx版本比较低,想安装高版本,可以进行以下操作:

    配置yum源:使用官网上的源

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
    gpgcheck=0
    enabled=1
    

    复制上面的代码并执行vim /etc/yum.repos.d/nginx.repo

    把代码粘贴进去,然后修改操作系统和版本号

    检查是否安装成功nginx -v,小v看版本,大v看编译参数

    安装目录

    晚上打字,眼有些花,难免会打错,尤其是路径和命令,要与实际目录相对比

    查看安装目录rpm -ql nginx,通过这条命令,可以nginx每个文件安装在哪

    /etc/logrotate.d/nginx配置文件,nginx日志轮转,用于logrotate服务的日志切割(其实这里我学的时候并不明白,Ծ‸Ծ)

    /etc/nginx/nginx.conf/etc/nginx/nginx.conf.default是主要的配置文件,也是学习nginx的关键文件

    /etc/nginx/fastcgi_params,/etc/nginx/uwsgi_params,/etc/nginx/scgi_params,配置文件,与cgi配置相关,fastcgi配置

    /etc/nginx/koi-utf,/etc/nginx/koi-win,/etc/nginx/win-utf,配置文件,编码转化映射转化文件

    /etc/nginx/mime.types,配置文件,设置http协议的content-type与拓展名对应关系

    /usr/lib/systemd/system/nginx/nginx-debug.service,/usr/lib/systemd/system/nginx.service,/etc/sysconfig/nginx,/etc/sysconfig/nginx,/etc/sysconfig/nginx-debug,配置文件,用于配置出系统守护进程管理器管理方式

    /usr/lib64/nginx/modules,/etc/nginx/modules,目录,nginx模块目录

    /usr/sbin/nginx,/usr/sbin/nginx-debug,,命令,nginx服务的启动管理的终端的管理命令

    /usr/share/doc/nginx-1.16.1,/usr/share/doc/nginx-1.16.1/COPYRIGHT,文件,目录,nginx的手册和帮助

    /var/cache/nginx,目录,nginx缓存目录

    /var/log/nginx,目录,nginx的日志目录

    编译参数

    执行nginx -V,可查看编译参数,注意是大写的V

    我这里的编译参数是这样的

    nginx version: nginx/1.16.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
    

    不同版本的结果略有区别,我这安装和编译均是在2020年初进行的

    几张截图大致了解一下重要的内容

    请求响应

    linux命令行的浏览器:curl http://baidu.com,返回的是html内容,如果想看请求响应的相关内容,执行curl -v http://baidu.com >dev/null,然后可看见请求响应这一过程的一系列信息,当然如果是图形界面可以在控制台看见

    日志类型

    包括:error.log,access_log

    执行tail -f /var/log/nginx/error.log查看error.log

    执行tail -n 200 /var/log/nginx/access.log,查看access.log,数字代表行数

    nginx变量

    http请求变量 -arg_PARAMETER,http_HEADER,send_http_HEADER

    内置变量 -nginx内置的变量

    自定义变量 -自己定义的变量

    nginx.conf里,我这在nginx.conf.default里配置不管用,不知为何,包括下面的只要配置参数基本都在nginx.conf里,网上大部分教程都是在nginx.conf.default里,我这就是不管用

    http {
        log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    

    这里第一个对于main级别的错误会按照这样的处理,其中开始的'$http_user_agent'是添加的http请求变量

    执行nginx -t -c /etc/nginx/nginx.conf检查nginx.conf是否有语法错误

    执行nginx -s reload -c /etc/nginx/nginx.conf重加载改动的文件,也可以对nginx进行重启,这样才能生效

    提供两个命令nginx -s quitnginx

    执行ps -aux | grep nginx,查看nginx是否启动

    nginx模块

    分官方模块和第三方模块,通过nginx -V,可大致查看,--with一类的模块是重点

    --with-http_sub_status_module,nginx客户端状态

    location /mystatus {
                    stub_status;
            }
    

    测试是否有语法错误nginx -tc /etc/nginx/nginx.conf

    在浏览器访问(本地主机)ip/mystatu,就会出现效果

    --with-http_random_index_module,目录中随机选择主页

    重启nginx还可以这样systemctl reload nginx,不过我更喜欢前面介绍过的方法

    location里加一句random_index on;,即可实现

    --with-http_sub_module,http内容替换


    sub_filter 'bbbbbbbbb' 'BBBBBB';
    sub_filter_once off;# 全部替换
    

    请求限制

    链接频率限制 -limit_conn_module

    请求频率限制-limit_req_module


    tcp复用:http请求建立在一次tcp基础连接上与一次tcp请求至少产生一次http请求


    测试这一块可用命令ab -n 50 -c 20 ip/..做压力测试

    参数说明:
    
    -n :请求总次数
    
    -c:并发数
    
    -k:是否开启长连接
    
    -s:超时设置
    

    访问控制

    基于ip访问:-http_access_module

    基于用户的信任登录: -http_auth_basic_module

     location ~ ^/admin.html {
            #       root html;
            #       deny 223.90.1.245;
            #        allow all;
            #        index 1.html 2.html index.html;
     }
    

    http_access_module局限性用一张图即可说明

    只能通过$remote_addr控制信任

    http_x_forwarded_for

    http_x_forword_for=Client IP, Proxy(1) IP, Proxy(2) IP,...

    解决http_access_module局限性

    方法一:采用别的http头信息控制访问,如:HTTP_x_FORWARD_FOR

    方法二:结合geo模块

    方法三:通过http自定义变量传递

    http_auth_basic_module

    需要用到htpasswd,所以需要安装yum install httpd-tools -y

    执行以下命令htpasswd -c ./auth_conf xxx,然后输入密码,确认密码

    将生成的auth.conf放置到nginx目录下

    nginx.conf进行如下配置

    location ~ ^/admin.html {
            auth_basic "Auth acess test! input your password!";
            auth_basic_user_file /etc/nginx/auth_conf;
            }
    

    然后访问页面就需要输入刚刚配置的用户名和密码

    http_auth_basic_module局限性

    1.用户信息依赖文件方式

    2.操作管理机械,效率低下

    解决方案

    1.nginx结合LUA实现高效验证

    2.nginx和LDAP打通,利用nginx-auth-ldap模块(好吧,我承认目前还不知道这些,以后才能知道)

  • 相关阅读:
    Set存储元素为啥是唯一的(以HashSet为例源码分析)
    HashTable原理与源码分析
    手写spring(简易版)
    java--String equals方法
    [java]创建一个默认TreeMap() key为什么不能为null
    [java]类初始化挺有意思的题目
    [java] 为什么重写equals()必须要重写hashCode()
    java --Integer 学习
    减少重复代码的书写--Lombok
    JavaScript随笔
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12489842.html
Copyright © 2020-2023  润新知