Nginx
Nginx:engine X
调用了libevent:高性能的网络库
epoll():基于事件驱动event的网络库文件
Nginx的特性: 模块化设计、较好扩展性(不支持模块动态装卸载,Tengine支持)
高可靠性 master-->worker //主控进程master负责解析配置文件并生成多个工作进程worker,worker负责响应服务 低内存消耗 一个线程响应多个请求 10000个keep-alive连接在Nginx仅消耗2.5MB的内存 支持热部署 不停机而更新配置文件、更换日志文件滚动、更新服务器程序版本 支持事件驱动机制、支持异步IO(AIO)、支持MMAP即内存映射 基本功能:
静态资源的web服务器,能缓存打开的文件描述符(打开一个文件后,这个文件对应的描述符可以被缓存下来,下次再次访问同一个文件时,可以提高效率)
可以作为http, smtp, pop3协议的反向代理服务器,
(不仅可以作为web服务器来工作,也可以作为web服务器的反向代理来工作)
反向代理、正向代理参考文章:http://blog.51cto.com/z00w00/1031287
缓存(键值:键是数据流,值是URL)、负载均衡; 只在反向代理时才能实现
支持FastCGI (fpm,LNMP)
模块化,非DSO(动态)机制,过滤器zip,SSI(服务器端包含)及图像大小调整;
支持SSL 之前是客户端和web服务器是直接相连接的,有了反向代理服务器的话,代理服务器把自己对外界客户端声称为自己是web服务器,但事实代理服务器不是web服务器。所有用户请求直接到达代理服务器,它会把请求接进用户空间,因为代理服务器上也有一个进程,这个进程称为代理进程,这个进程解析用户请求,并判断这个客户端是否允许访问web服务器,如果不能直接拒绝,如果允许,代理服务器上的进程会把这个请求报文封装为另一种样子再向web服务器发送。
此时,后端的web服务器收到请求报文后,发现请求报文的发出者还是原来的客户端吗?不是,此时发出者是代理服务器。此时代理服务器就把客户端和真的web服务器隔离了。
像这一种能声称自己是web服务器,并能接受外部的请求,但又不真正提供任何内容的,转而把用户的请求重新封装发送给后端的服务器,并从后端服务器取回内容,代理服务器再次把取回的内容封装为响应报文响应为客户端。这就是反向代理,反向代理可以是N级的。
正向代理和反向代理的区别:
反向代理通常只为一个或有限的网站提供反向代理;
正向代理指用户无论访问任何网站,都把用户的请求提交给代理主机,代理主机无论客户端请求的是什么网站,都自己作为客户端到互联网上连线服务器,并把取到的结果在本地(正向代理)封装后直接返回客户端。
正向代理是代表客户端请求网站,反向代理代为接受用户请求,并自行到某些或某个有限的服务器上去取内容,反向代理把自己扮演成某个服务器的样子,正向代理把自己扮演成所有服务器的样子
扩展功能:
基于名称和IP的虚拟主机;
支持keepalive
支持平滑升级
定制访问日志 ,支持使用日志缓冲区提高日志存储性能
支持url rewrite
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
Nginx的基本架构:
一个master进程,生成一个或多个worker进程
事件驱动: epoll(默认使用边缘出发)(linux), kqueue(BSD), /dev/poll (event ports)
消息通知:select, poll, realtime signals IO复用
支持sendfile, sendfile64 大小不同
支持AIO
支持mmap
什么是sendfile?
对于一个静态web服务器来讲,一个请求先进入网卡设备,通过网卡设备后这个请求会通过注册监听在80端口上的内核套接字绑定,根据用户请求的目标端口从而实现向用户空间的web服务转发,web服务收到请求后向内核发起IO请求,内核就会把文件从磁盘加载进内核内存,而后从内核内存再复制给进程内存,然后进程就会构建响应报文,就会从进程内存发往内核内存,因为能调用网卡的只有内核,所以进程会发起网络IO,进程发起调用时会把数据从自己的进程内存空间发往内核内存空间,放到网卡发送队列中去,进而通过网卡发送出去。所以数据的整个流程是:从磁盘到内核-->从内核到用户空间-->从用户空间到内核。数据虽然到用户空间,却并未做什么改变,所以比较浪费资源。所以可以让内核在磁盘取得数据之后直接发往网卡,不再发往用户空间。这种机制就叫sendfile。
nginx的工作模式: 非阻塞、事件驱动、一个master生成一个或多个worker线程, 每个worker响应n个请求;
模块类型:
核心模块
Standard HTTP modules 标准的httpd协议模块
Optional HTTP modules 可选的httpd协议模块
Mail modules 邮件模块
3rd party modules 第三方模块,需要编译安装nginx手动指定
Nginx安装方法
rpm及源码安装:
nginx-1.6.3]# ./configure --help | less //查看需要启用哪些功能,注意这是在解压后的nginx目录下
# groupadd -r nginx
# useradd -g nginx -r nginx //添加普通用户运行nginx的worker 进程
# yum install pcre-devel -y 实现URL重写
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
//--http-log-path 访问日志路径
//--lock-path= 锁文件
//--with-http_stub_status_module 状态页面
//--with-http_flv_module 支持流媒体
//--http-client-body-temp-path 指明客户端默认body的临时路径,如果所致路径不存在要自己创建
//--http-proxy-temp-path
# make && make install
# mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
编译安装遇到的问题:
./configure: error: SSL modules require the OpenSSL library. 解决办法:#yum -y install openssl openssl-devel
./configure: error: C compiler cc is not found 如果出现错误 #yum install gcc -y
open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) #mkdir /var/run/nginx
解决办法 https://blog.csdn.net/zyhlearnjava/article/details/71932719
# /usr/local/nginx/sbin/nginx //启动nginx,因为此时没有配置环境变量
# /usr/local/nginx/sbin/nginx -s stop //停止nginx
如果想要直接使用#systemctl start nginx等命令参考如下:
https://www.jianshu.com/p/759601b29dde
https://www.jianshu.com/p/b5fa86d54685
# ss -tunlp //可以查看到80端口是由nginx监听的
输入IP即可查看
制作好的程序包:rpm包
配置文件: main配置段:全局配置段 event:定义event模型工作特性 http {}:定义http协议相关的配置 配置指令要以分号结尾,语法格式: directive value1 [value2...]; 指令值
支持使用变量: 模块内置变量(模块自带,模块会提供内建变量定义)
自定义变量
set var_name value
主配置段的指令的类别:
用于调试、定位问题
正常运行必备的配置
优化性能的配置
事件相关的配置
3、nginx web服务配置详解
主配置段的指令:
1、正常运行的必备配置: http://nginx.org/en/docs/ngx_core_module.html
1、user USERNAME [GROUPNAME]; 指定运行worker进程的用户和组,
例如:user nginx nginx;
2、pid /path/to/pid_file; 指定nginx守护进程的pid文件;
例如:pid /var/run/nginx/nginx.pid
3、worker_rlimit_nofile #; 指定所有worker进程所能够打开的最大文件句柄数;
4、worker_rlimit_sigpending #; 指定每个用户能够发往worker的信号的数量;
2、优化性能相关的配置:
1、worker_processes #: worker进程的个数;通常应该为物理CPU核心个数减1;
2、worker_cpu_affinity cpumask ...; 绑定worker进程至指定的CPU上; 优点:提高CPU缓存命中率
缺点:无法避免进程切换
context switch:进程切换会产生CPU的不必要的消耗,当进程数少于CPU数时,把每一个进程明确指明绑定在指定CPU上,就减少了进程被来回调度到不同的CPU上,虽然这样不能避免进程切换,因为一个CPU要运行不同的进程,只是一个进程被绑定在CPU上后,被切换出再被切换进来时,仍然运行在同一颗CPU上,这样的好处是这个进程的缓存不会失效,但是无法避免进程切换
CPUMASK CPU掩码,比如主机上有4颗CPU,用8位二进制来表示
0000 0001 表示1号CPU
0000 0010
0000 0100
0000 1000
例如:
worker_cpu_affinity 00000001 00000010 00000100; 前三颗
3、timer_resolution t; 计时器解析度,降低此值,可减少gettimeofday()系统调用的次数;
减少worker线程中的计时器的解析度,可以减少发起gettimeofday()的系统调用次数,任何一个进程运行中,如果系统调用很多,每一次系统调用都会产生软中断,产生软中断的直接结果是模式转换,模式转换必然消耗时间,而一个生产力强的应用进程应该把大量时间尽可能多的应用在用户空间。
那么为什么要用到时间解析度呢?例如一个请求到达nginx后,nginx就会响应它,nginx响应完毕后会记录日志,那么日志就会记录时间,那么nginx在处理响应并记录日志就必须获取当前系统时间并记录于日志文件中。
如何获取系统时间?就是通过gettimeofday()系统调用,获取后把时间保存在日志文件中,如果时间解析度过大的话,带来的结果是一秒钟就解析1000次,比较占用资源。
4、worker_priority nice; 指明worker进程的优先级即指明nice值,nice值越小对应的优先级越高
nice值的范围:-20, 19 -20对应的优先级是100,19对应的是139
3、事件相关的配置:
1、accept_mutex [on|off] 内部调用用户请求至各worker时用的负载均衡锁;打开时表示能让多个worker轮流地、序列化地与响应新请求;
2、lock_file /path/to/lock_file; accept_mutex即互斥锁的锁文件路径
3、accept_mutex_delay #ms;
4、use [epoll|rgsig|select|poll]; 定义使用的事件模型;建议让Nginx自动选择;
5、worker_connections #; (可设置为51200) 每个worker进程所能够响应的最大并发请求数;
nginx能够接受的最大链接数 = worker_processes * worker_connections 不应该大于6万
用于调试、定位问题: 编译安装时要有--with-debug
1、daemon [off|on] 是否以守护进程方式启动nginx;调试时应该设为off,其他情况为on
2、master_process on|off; 是否以master/worker模型来运行nginx;正常情况下是on,调试时可以设置为off
3、error_log /path/to/error_log level;
错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;
常需要进行调整的参数:
worker_processes、worker_connections、worker_cpu_affinity、worker_priority # /usr/local/nginx/sbin/nginx -s reload //重新加载nginx
nginx作为web服务器时使用的配置
http {}:由Module ngx_http_core_module模块所引入
http配置:http core 配置一个静态web服务器
ngx_http_core_module
配置框架:
http {
upstream { //负载均衡或反向代理时可用到
.,..
}
server {
location { //类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系;可以有多个
root "/path/to/file" //指明一个本地文件系统路径
. . .
}
location URL {
if ... { //引入if语句
}
}
. . .
} #每个server类似于httpd中的一个<VirtualHost>即虚拟主机
server { //可能有多个server
. . .
}
}
listen IP:PORT;
注意:与http配置相关的指令必须放在http、server、location、upstream、if块中;但有些指令只能应用于这5中上下文的某些中;
配置框架中经常用到的配置指令
虚拟主机相关的配置:
1、server {} 定义一个虚拟主机;
例子:定义一个基于端口的虚拟主机
server {
listen 8080; //监听的端口,两个server不能使用同一个套接字,(基于IP,就是IP:PORT)
server_name www.dongshi.com; //定义主机名
root "/var/web1"; //对应的网页文件位置
}
# mkdir /var/web1
# vim /var/web1/index.html
<h1>This is web1</h1>
# /usr/local/nginx/sbin/nginx -s reload //此时已经监听了8080端口,因为nginx有master进程,通知master自己打开监听端口
在浏览器中输入:http://192.168.184.141:8080/
2、listen 指定监听的地址和端口
完整格式 :
listen address[:port] [default_server] [ssl] [spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen address[:port] [default_server] ssl
backlog=number: 指明TCP协议backlog队列的大小。默认为-1,表示不设置;
rcvbuf=size:设定监听句柄的SO_RCVBUF参数;
例如:
listen 172.16.100.8:8080
3、server_name name [...]; 后可跟多个主机名;名称还可以使用通配符和正则表达式(~);
匹配法则:优先级从(1)至(5)
(1) 先做精确匹配;www.magedu.com:
(2) 左侧通配符匹配,例如:*.magedu.com;
(3) 右侧通配符匹配,例如:www.*;
(4) 正则表达式匹配,例如: ~^.*\.magedu\.com$,这里\是转义字符,因为.magedu中有.,所以要做转义
(5) default_server 默认
4、location [=|~|~*|^~] /uri {...} uri可以理解为URL 非常重要
location @name
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理; 例如做访问控制
=: 精确匹配检查;
~: 正则表达式模式匹配,区分字符大小写;
~*:正则表达式模式匹配,不区分字符大小写;
^~:URI的前半部分匹配,不检查正则表达式;
匹配优先级:精确匹配(=)、^~、~和~*、由不带符号的location;
server { 一个server中多个location
listen 80;
server_name www.dongshi.com;
location / { "/"表示根,(不带任何符号)
root "/var/web1"; 这里表示根目录即 / 是相对于/var/web1而言的,即请求根目录就是请求/var/web1
}
location /images/ { 这里的/images目录是相当于/var/images而言的
root "/var/images";
}
location ~* \.php$ { 指明以.php结尾的话,指明使用fcgipass,\.php这里的\是转义符,是为.作转义的
fcgipass
}
}
当访问http://www.dongshi.com/bbs/index.php就根据优先级匹配,第一个location和第三个location可以匹配到,但是第三个location(~* \.php$)是优先级优与不带任何符号的 /,因此生效的是~* \.php$
示例:
# mkdir -pv /vhosts/{web1,images,text} //创建目录
# mkdir /vhosts/images/images/a.txt
# vim /vhosts/text/a.txt
<h1>/vhosts/text/a.txt</h1>
# vim /vhosts/images/images/a.txt
<h1>/vhosts/images/images/a.txt</h1>
# vim /vhosts/web1/a.txt
<h1>/vhosts/web1/a.txt</h1>
# /usr/local/nginx/sbin/nginx -s reload //重新加载
5、root http://nginx.org/en/docs/http/ngx_http_core_module.html#root
设置web资源路径映射;用于指明请求的URL所对应的文档的根目录路径;
应用场景:http
, server
, location
, if in location
location /images/ {
root "/web/imgs/";
}
6、alias path 用于location配置段,定义路径别名
location /images/ {
alias /www/pictures/; //注意此处pictures后面的斜线要和上一行images后面的斜线保持一致,要有都有,要没有都没有
}
注意:
root表示指明路径为对应location的根"/"URL;
location /images/ {
root "/vhosts/web1";
}
访问这个网址:http://www.donshi.com/images/a.jpg 相当于--> /vhosts/web1/images/a.jpg
alias表示路径映射,即location中的URL是相对于alias所指明的路径而言;
location /images/ {
alias "/www/pictures/"; //注意此处pictures后面的斜线要和上一行images后面的斜线保持一致,要有都有,要没有都没有
}
访问这个网址:http://www.donshi.com/images/a.jpg 相当于--> /www/pictures/a.jpg
4、nginx web服务配置详解
7、index file 默认主页面
index index.html; file文件的名称,也是分次序的,比如index index.php index.html就会先找index.php,如果找不到再找index.html
8、error_page code [...] [=code] URI | @name 根据http状态码重定向错误页面(code指状态码)
error_page 404 /404.html //
=[code]: 以指定的响应码进行响应;省略code表示以新资源的响应码为响应码;
location / {
root "/vhosts/web1";
error_page 404 /404_html; 或者自定义响应码 error_page 404 =200 /404_html;
}
9、基于IP的访问控制
allow IP/Network;
deny IP/Network;
# vim /vhosts/web1/index.html
web1:192.168.184.141
此时在浏览器中输入http://192.168.184.141:8080/就可以访问了
再次修改
10、基于用户的访问控制
两种:basic,digest;
auth_basic ""; 提醒用户为什么做认证
auth_basic_user_file "/PATH/TO/PASSWORD_FILE"; //和用户相关的账号密码文件位置
账号密码文件建议使用htpasswd来创建
# rpm -q httpd //先查看是否安装了httpd,因为需要用到htpasswd命令,但是不要启动httpd
# htpasswd -c -m /etc/nginx/users/.htpasswd tom //-c只需要在第一次使用此命令时使用,-m指使用md5加密
11、https服务
生成私钥,生成证书签署请求,并获得证书;本机既充当CA,又充当nginx web服务器 https://blog.csdn.net/gengxiaoming7/article/details/78505107
修改nginx的主配置文件
server {
listen 443 ssl;
server_name localhost; //这里应该写为服务器主机名
ssl_certificate /etc/nginx/ssl/nginx.crt; //证书文件
ssl_certificate_key /etc/nginx/ssl/nginx.key; //私钥文件
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / { //指明虚拟主机的位置
root /vhosts/web1;
index index.html index.htm;
}
}
# /usr/local/nginx/sbin/nginx -t //
# /usr/local/nginx/sbin/nginx -s reload
# vim /etc/hosts //可以解析本主机服务器
192.168.184.142 www.dongshi.com
12、stub_status {on|off}
//开启状态页面,只能用在location上下文,用法在location中开启stub_status,然后定义哪些主机可以访问就可以了
location /status {
stub_status on;
allow 192.168.184.0/24;
deny all;
}
结果示例中:
Active connections: 2 //当前处于所有处于打开状态的链接数,包括代理的
server accepts handled requests //接受下来并以处理的请求
6 6 7 //第一个数字6表示已经接受进来的链接,第二个数字6表示已经处理过的链接,第三个数字7表示已经处理的请求(这里可能启动了保持链接功能)
//链接和请求是两码事,对于一个保持链接的链接来讲,一个链接可能会发N个请求,在"保持连接模式"下请求链接可能会多于链接数量
Reading: 0 Writing: 1 Waiting: 1
- Reading:表示正处于接受请求状态的链接数,
- Writing:请求已经接受完成,正处于处理请求或发送响应的过程中的链接数
- Waiting:处于保持链接状态模式,且处于活动状态的链接数
13、rewrite regex replacement flag;
实现URL重写(把访问的URL换作其他的URL) regex:正则表达式 flag:标志位
例如:rewrite ^/images/(.*\.jpg)$ /imgs/$1 break; break是标志位(rewrite规则可能有N条)
//^/images/(.*\.jpg)$:以image开头,中间可跟任意内容,后面以.jpg结尾,把前面的URL换作/imgs/$1,即把位置挪到imgs目录下,
/imgs/$1 表示把/images换位imgs,$1表示之前的images目录后的内容不变,nginx中后向引用使用$#;
示例:http://www.magedu.com/images/a/b/c/1.jpg --> http://www.magedu.com/imgs/a/b/c/1.jpg
用到的场景:网站更改域名、页面路径更换。
flag:四种
last:一旦此rewrite规则重写完成后,不再被后面其他的rewrite规则进行处理(因为rewrite规则可能有N条),而是由user agent重新对重写后的URL再一次发起 请求,并从头开始执行类似的过程
比如有N条rewrite规则,
第一条:.......
第二条:.......
第三条:rewrite ^/images/(.*\.jpg)$ /imgs/$1 last;
第四条:.......
例如当用户请求的时候,会检查第一条rewrite规则,如果不匹配,则检查第二条,还不匹配继续检查第三条,第三条匹配了则不再往下检查(第四条)了,因为规则被检查到后就被重写为一个新的URL,这个新的URL会再次被发给nginx服务器,nginx服务器一样会重新开始上面的检查过程,如果再次被重写还会继续检查,这就是last的意义。last是循环循环再循环,直到没有满足的规则才跳出
(用户本来访问的URL是http://www.magedu.com/images/a/b/c/1.jpg,当URL被重写后变成-->http://www.magedu.com/imgs/a/b/c/1.jpg,用户的浏览器会重新用新的URL对web服务器发起新请求,web服务器收到新请求后会像此前处理任何请求一样处理这个新请求。)
break:一旦此rewrite规则重新完成之后,有user agent对新的URL重新发起请求,且不再会对当前location内的rewrite规则所检查,直接跳出。
使用场景:检查规则中有两天规则会造成循环
rewrite ^/images/(.*\.jpg)$ /imgs/$1 last; 这里两条规则就会陷入死循环,如果后的last改为break就没问题了
rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;
redirect:以302响应码(临时重定向)返回新的URL;
使用场景:如果一个替换成的目标位置是以http开头的时候,且是一个新的绝对路径时,可以利用redirect实现
permanent:以301响应码(永久重定向)返回新的URL;
break示例:
# vim /etc/nginx/nginx.conf
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# mkdir /vhosts/web1/forum
# vim /vhosts/web1/forum/index.html
<h1>New URL:Forum</h1>
http://192.168.184.141:8080/bbs
# tail /var/run/log/access.log
使用redirect举例
# vim /etc/nginx/nginx.conf
# /usr/local/nginx/sbin/nginx -s reload
http://192.168.184.141:8080/bbs //由于rewrite重写规则中 bbs 后面没有添加"/",那么这个也不能 bbs 后也不能加"/"
这个例子是bbs后添加了"/"
14、if
语法:if (condition) {...}
应用环境:location和server
condition用法:
(1)变量名:变量值为空串,或者以"0"开始,则为false;其他的均为true;
(2)以变量为操作数构成的比较表达式,可使用=,!=类似的比较操作符进行测试;
(3)正则表达式的模式匹配操作
~:区分大小写的模式匹配检查
~*:不区分大小写的模式匹配检查
!~和!~*:对上面两种测试取反
(4)测试路径为文件的可能性:-f,!-f
(5)测试指定路径为目录的可能性:-d,!-d
(6)测试文件的存在性:-e,!-e
(7)检查文件是否有执行权限:-x,!-x
示例:
if ($http_user_agent ~* MSIE) { //$http_user_agent如果无法判断可以查看nginx的官方文档,里面有core_module或http_core_module或其他 标准模块的module,他们会引入这个变量。http_user_agent是内建变量,表示客户端的浏览器类型。
rewirte ^(.*)$ /msie/$1 break; //如果客户端的浏览器类型是MSIE,那么就重写
}
//当使用手机打开网页时,打开的是web站点,而不是官方站点,里面是有重写,通过判断浏览器类型是否能匹配到iPhone、iPad、安卓等这样的字符串,use agent是有 特定字符的,如果是的,就定向至web站。
15、防盗链
location ~* \.(jpg|gif|jpeg|png)$ { //如果用户访问的是以.jpg|gif|jpeg|png结尾的
valid_referer none blocked www.dongshi.com; //valid_referer是nginx自带的一个指令,用于定义哪种引用是合法的 none blocked是不做阻止的
//来自于www.dongshi.com这个域名的站点对本站内所有引用是被定义成合法的
if ($invalid_referer) { //$invalid_referer是referer标准模块引入的一个变量,表示只要不能被valid_referer定义为合法引用的,统统都被归类到 //不合法($invalid_referer)的引用上,所以如果$invalid_referer这个变量值不为空,证明此次引用是不合法的,因为此次为 //空就证明以上被上面匹配了
rewrite ^/ http://www.dongshi.com/403.html; //不合法引用,则无论引用什么内容,都把URL重写到后面的URL上-->http://www.dongshi.com/403
}
}
16、定制访问日志格式 https://www.cnblogs.com/kevingrace/p/5893499.html https://www.jianshu.com/p/d1c7429493b0
log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' main是格式名
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; //使用定义访问日志,需要开启这一项,指明具体位置(logs/access.log这里最好使用绝对路径),并指明使用什么格式
注意此处可用变量为:此处而用变量为nginx各模块内建变量
网络连接相关的配置: 在利用nginx做反代服务器时可以用到
1、keepalive_timeout time; 保持连接的超时时长,默认为75s;
2、keepalive_requests #; 在一次保持连接上允许承载最大资源请求数;
3、keepalive_disable [msie6|safari|none] 为指定类型的浏览器禁用长连接;
4、tcp_nodelay on|off 对长连接是否使用TCP_NODELAY选项;
TCP/IP网络有一个"小数据包"的问题,如果一条信息中只有一个字符,那么网络可能会堵塞。这样的数据包大小为41字节,其中TCP信头40字节,内容为1字节。像这种小数据包,它们的开销是4000%。大量的小数据包可以迅速让网络饱和。 https://blog.csdn.net/shaobingj126/article/details/6758707
John Nagle发明了Nagle算法,它在一定的时间段,将小数据包暂存,将这些小数据包集合起来,整合为一个数据包发送,在下一个时间段又是如此。这改善了网络传输的效率。时间段通常为200ms。 https://www.linuxdashen.com/nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96
但值得注意的是,小数据包的问题在telnet的通信过程中仍然存在。在telnet中,每一次敲键都分别在网络发送。不过这跟web服务器没有关联。web服务器发送的文件大多是大数据包,所以它们会被立即发送,而不需要等待200ms。
5、client_header_timeout time; 读取http请求报文首部的超时时长;
6、client_body_timeout time; 读取http请求报文body部分的超时时长;
7、send_timeout time; 发送响应报文的超时时长;
fastcgi的相关配置
LAMP:php与httpd结合时,是把php直接作为httpd的模块
LNMP:php与nginx结合时,php启用fmp模型
在nginx上配置php
location ~ \.php$ {
root html; //指定根目录
fastcgi_pass 127.0.0.1:9000; //反向代理,fpm一般启用本机的9000端口,如果是另一台主机,要监听在web网卡上,而且iptables要放行对9000 端口的请求
fastcgi_index index.php; //指明fastcgi主页是index.php
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params; //include表示要包含进来/etc/nignx目录下的文件fastcgi_params,这个文件定义了如何把用户请求时的变量 值映射提供给后端的fastcgi服务器
}
# vim /etc/nginx/fastcgi_params
fastcgi_param QUERY_STRING $query_string; //把$query_string这个变量值赋值给 QUERY_STRING,大写的变量是在fastcgi或fpm中使用的,是映射
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
对客户端请求进行限制:
1、limit_except METHOD {...} 指定对范围之外的其它方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
2、client_body_max_size SIZE; 限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;
3、limit_rate speed; 限制客户端每秒种传输的字节数,默认为0,表示无限制;
对内存或磁盘资源进行分配
1、client_body_in_file_only on|clean|off;
请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;
2、client_body_in_single_buffer on|off
3、client_body_buffer_size size;
4、client_body_temp_path DIR [level1 [level2 [level3 [level4]]]]
例如:client_body_temp_path /var/tmp/nginx/client 1 2
5、client_header_buffer_size size: