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模块(好吧,我承认目前还不知道这些,以后才能知道)

posted @ 2020-03-13 23:23  跌打的小脆骨  阅读(271)  评论(0编辑  收藏  举报