学习完了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性能,时常用于服务端的反向代理和负载均衡
优点:
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,数字代表行数
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 quit
和nginx
执行ps -aux | grep nginx
,查看nginx是否启动
分官方模块和第三方模块,通过nginx -V
,可大致查看,--with一类的模块是重点
location /mystatus {
stub_status;
}
测试是否有语法错误nginx -tc /etc/nginx/nginx.conf
在浏览器访问(本地主机)ip/mystatu,就会出现效果
重启nginx还可以这样systemctl reload nginx
,不过我更喜欢前面介绍过的方法
location里加一句random_index on;
,即可实现
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_forword_for=Client IP, Proxy(1) IP, Proxy(2) IP,...
解决http_access_module局限性
方法一:采用别的http头信息控制访问,如:HTTP_x_FORWARD_FOR
方法二:结合geo模块
方法三:通过http自定义变量传递
需要用到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模块(好吧,我承认目前还不知道这些,以后才能知道)
原文:https://www.cnblogs.com/ycoder/p/12489851.html