查看/etc/nginx/nginx.conf文件:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
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"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
include /etc/nginx/conf.d/*.conf:包含了/etc/nginx/conf.d文件夹下的所有配置,即会先读取nginx.conf文件,再去读被包含的文件。
Nginx配置文件有三大块的内容,其中前面的一块是一个全局配置,配置有nginx服务的系统使用用户、工作进程数等。
user:可以设置为其他用户
work_processes:跟nginx的多进程的方式有关系,该数量一般与cpu保持一致。
events模块:
该模块是事件模块,可以在该部分设置使用内核模型,比如epoll等。
worker_connections:需要根据实际情况调整。
use:可以设置nginx使用哪种内核模型。
http模块:
按照层级来划分,http是最外一层。所有的http可以包含多个http的服务。一个server可以配置一个独立的站点,在每一个server里配置其当前的属性,主要配置其监听端口,服务名。location主要控制着我们每一层路径的访问。
Nginx参数配置:
日志配置:
log_format只能配置在http节点下。
error_log /var/log/nginx/error.log warn;表示error.log文件位置及日志级别。
此处的main就是log_format的name
后续的例如$remote_addr是nginx的变量,它们通过一定的符号连接在一起,组成一定的日志格式,然后打入到access.log里面。
Nginx变量:
Nginx模块:
分为nginx官方模块和第三方模块。
官方模块:
stub_status_module:
该模块主要用于展示nginx当前处理连接的状态,用于我们监控nginx当前连接的信息。
配置语法:
示例配置:
访问后:
其中active connections为nginx当前活跃的连接数
server accepts handled requests下展示三个数分别为接受的握手总次数,处理的连接数,总的请求数,正常情况下握手总次数等于处理的连接数是相等的表示没有丢失。
Reading表示正在读的个数。Writing表示正在往nginx写的个数。Waiting
表示等待次数。该数主要是nginx开启keep-alive也就是长连接的情况下,客户端表示的是客户端和服务端在空闲的等待既没有读也没有写但是建立连接的数量。
http_random_index_module:
该模块主要在它的主目录里随机的选择一个文件作为它的默认随机主页。
配置语法:
配置示例:
http_sub_module:
用于nginx服务端在给客户端response的http内容的时候,用于对http的内容进行替换。
配置语法:
效验服务端文件是否有更新,有更新返回给客户最新的文件。
为on时,替换指定http内容的第一个。反之为全部。
配置示例:
Nginx请求限制:
http协议的请求与连接
http协议是建立在tcp协议上,要完成一次http请求需要先进行tcp的三次握手,建立tcp连接。建立完成后才会进行http的请求和响应。最后通过服务端和客户端不断发送FIN和ACK包来保持连接的状态。也就是我们所说的长链接和keep-alive。通过上图可以看出连接是建立在http请求的基础之上。
在http1.0的版本里,tcp是不能复用的也就是客户端向服务端发送请求后,服务端在对应的时间里就会断开。一次连接就对应一次请求。在1.1版本里,一个连接就会被顺序性的被复用而发起多次的顺序性的http请求。2.0后就可以多路复用。
连接限制配置语法:
请求限制配置语法:
配置示例:
Nginx访问控制:
http_access_module配置语法:
Address为ip,CIDR为网段 all全部,unix为socket连接。
配置示例:
访问控制原理:
局限性:Nginx访问控制是基于客户端的ip来实现的,但是对于nginx来说,它不认为哪一个是客户端,如果我们的服务端不是客户端与服务端直接连接,而是通过了一层代理来访问,那么实际服务端获取的IP为IP2,而实际上我们想要拦截的IP1。
解决方法:
通过使用x_forwarded_for解决,它是通过一连串的ip组成的信息。
几种常用的解决方式:
认证登录模块:
配置示例:
局限性:
解决方案: