Nginx

Nginx:engine x

	Tengine
	Registry

nginx调用了libevent。
libevent是一个高性能的网络库,epoll()
nginx特新

模块化设计、较好的扩展性
高可靠性:master--->worker
底内存消耗:1000个keep-alive模式下的connection,仅需2.5MB的内存
支持热部属:可以不停机更新配置文件,日志文件滚动,升级程序版本;
支持事件驱动,AIO(异步IO)

基本功能:

静态资源的web服务器,能缓存打开的文件描述符
http、smtp、pop3协议的反向代理服务器
缓存功能,负载均衡
支持FastCGI(fpm,LNMP)
模块化(非DSO机制)
支持SSL

扩展功能:

支持名称和IP的虚拟主机
支持Keepalived
支持平滑升级
制定访问日志、支持使用日志缓冲区提供日志存储性能;
支持url rewirte
支持路径别名
支持基于IP及用户的访问控制
支持速率限制,支持并发数限制
nginx的基本架构

在这里插入图片描述
nginx的工作模式: 非阻塞,事件驱动,由一个master进程生成多个worker线程,每个worker线程响应n个请求。所以总的并发数为:worker数量 * n
sendfile是什么:
一般响应用户请求过程:磁盘---->内核----->用户空间----->内核----->客户端
这样有点麻烦,可以这样做:磁盘---->内核---->客户端。这就是sendfile
httpd服务也支持sendfile这种机制

模块类型:

核心模块
Standard HTTP modules
Optional HTTP modules
Mail modules
3rd party modules
前4种模块nginx自带,第三方模块需要我们在编译时指定

配置文件:

	main配置端:全局配置段
	event{ }:定义event模型工作特性
	http{ }:定义http协议相关配置
	支持使用变量:	
		内置变量:模块会提供自建变量定义
		自定义变量:set var_name value

nginx主配置段指令:

  • 正常运行的必备配置:
    1、user USERNAME [GROUPNAME]
    指定运行worker进程的用户和组
    user nginx nginx;

    2、pid /path/to/pid_file;
    指定nginx守护进程的pid文件
    pid /var/run/nginx.pid;

    3、worker_rlimit_nofile #;
    指定所有worker进程所能打开的最大文件数;

  • 性能优化相关配置
    1、worker_processes #;
    worker进程的个数,通常应略少于cpu物理核心数;
    2、worker_cpu_affinity cpumask …;
    如果主机有多个物理核心,对于非常繁忙的worker进程来说可能会被不停的调度到不同的cpu上,所以每个进程在哪个cpu上都是不确定的。
    所以可以将worker进程于cpu绑定,1号绑定在1号cpu上,2号进程绑定在2号cpu上…
    所谓的绑定不是1号cpu一定属于1号进程,如果有其他进程需要在1号cpu上运行,1号进程还是会被切出去的,只是说1号进程一定只能在1号cpu上运行。
    所以绑定虽然避免不了进程切换,但可以保证绑定的进程的缓存不会失效。
    即:假设一个worker进程在某个cpu上运行,该进程加载到了很多数据到cpu的缓存上,如果把该进程调度到其他cpu上,则缓存就失效了。
    优点:会提高缓存命中率;
    context switch(进程切换):会产生不必要的cpu消耗;
    3、worker_priority number;
    指明worker进程的nice值;
    -20,19
    100,139

  • 事件相关配置:
    1、accept_mutex{off|on};
    master调度用户请求至个各worker进程时使用的负载均衡,on表示能让多个worker轮流的,序列化的去响应用户请求;
    2、use [epoll|rtsig|select|poll];
    指明使用的事件模型,建议让nginx自行选择
    3、worker_connections #;
    设定单个worker进程所能处理的最大并发连接数量

总的并发连接数:worker_connections * worker_processes

  • 用于用户调试、定位问题:
    1、deamon {on|off};是否以守护进程运行nginx,调时时应设置为off;
    2、master_process {on|off}; 是否以master/worker模型来运行nginx,调时时设置为0ff;
    3、error_log file

新改动的配置生效方式: nginx -s reload

nginx作为web服务器所使用的配置:

http {}:由 ngx_http_core_module模块引入;

配置框架:

http {
	upstream {
			....
						}

	server {
		location URL {
			root "/path/to/somefile ;
								}  #类似于httpd中的<location>,用于定义URL与本地文件系统的映射关系;
			location URL {
				if  ... {
				}
							}
				}   #可以有多个server,每个server相当与httpd中的虚拟主机
}

配置指令:
1、server { }
定义一个虚拟主机:基于端口

server {
	listen 8080;
	server_name www.wtt.com;
	root /vhost/web1;	
}	

2、listen
指定监听的地址和端口
listen address[:port]
listen port
3、server_name NAME1 NAME2 … ;

	后可跟多个主机,名称可以使用正则表达式或通配符
	(1)先做精确匹配检查;
	(2)再做左侧通佩符匹配检查,*.wtt.com
	(3)右侧通配符检查:如:mail.*
	(5)正则表达式检查:~^.*\.wtt\.com     
	(6)default_server

4、root path;
设置资源路径映射;用于指明请求的URL对应的资源做在文件系统上的起始路径;
放的容器越大,生效的优先级越低。
例如:放在http{ }中的优先级比server{ }中的优先级低,而server{} 比location { }低。
5、location { }
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理。例如访问控制等功能。

 	location [ = | ~ | ~* | ^~ ] uri { ... }
	location @name { ... }
	Default: 	—
	Context: 	server, location

=:精确匹配检查
~:正则表达式模式检查
~*:正则表达式模式检查,不区分大小写
^~:URI的前半部分匹配,不支持正则表达式	
匹配优先级:= , ^~ ,~,~*,不带任何符号的location

例如:
server {
listen 80;
server_name www.wtt.com;
	location / {
	root  /vhost/web1;
	}
	location /image/ {
	root /vhost/web2;
	}
	location ~* \.php$ {
	fcgipass;
	}
}
访问:http://www.wtt.com/bbs/index.php
由于第一个和第三个都可以匹配到,由于~*的优先级大于不带任何符号的优先级,所以第三个生效。

5、alias path;
用于location段,用于定义路径别名。
注意:root表示指明路径对应的location “/” URL;alias表示路径映射,即location指令后定义的URL是相对于aliase所指明的路径而言。
例如:

location /imsge {
root "/vhosts/web1";
}
访问http://www.wtt.com/image/a.jpg 其实是访问 /vhost/web1/image/a.jpg

location /image {
alias “/www/pictures/“;  #注意pictures后一定要加/
}
访问 http://www.wtt.com/image/a.jpg 其实是访问 /www/pictures/a.jpg  。与你定义的location后的路径无关。

6、index file;
默认主页面

	index index.php index.html;

7,自定义错误页面

error_page code [...] [=code] URI @name    根据http地响应状态码指明特用的错误页面
例如:	error_page 404 /404_customed.html

在location里面定义错误页面
在这里插入图片描述
建立如下的错误页面
在这里插入图片描述
重载服务后访问一个不存在的页面
在这里插入图片描述

8、基于ip的访问控制

allow ip/network;
deny ip/network;

例如:拒绝172.25…44.2这台主机的访问
在这里插入图片描述

重载服务后
使用172.25.44.250主机去访问,正常
在这里插入图片描述
使用172.25.44.2这台主机去访问,被forbidden了
在这里插入图片描述
仅允许172.25.44.0/24这个网段的主机访问
在这里插入图片描述9、基于用户的访问控制

basic、digest
auth_basic  "...";
auth_basic_user_file; :帐号密码文件,建议使用htpasswd来创建。

在这里插入图片描述
在这里插入图片描述
-m表示使用md5加密方式

10、ssl
在这里插入图片描述

12、stub_status {on|off}; 仅用于location中

在这里插入图片描述
在这里插入图片描述

Active connections: 1   #当前所有处于打开状态的连接数
server accepts handled requests
 20 20 39   #已经接受的连接   已经处理过的连接  已经处理的请求。(在“保持连接“模式下,请求数可能会多于连接数)
Reading: 0 Writing: 1 Waiting: 0   
Reading:处于接收请求状态的连接数
Writing:请求已接首完成,正处于处理请求或发送响应的过程的连接数
Waiting:保持连接模式。且处于活动状态的连接数。

12、rewirte regex repacement flag;
例如:rewirte ^/images/(.*\.jpg)$ /imgs/$1 break;

http://www.wtt.com/images/a/b/c/1.jpg----->http://www.wtt.com/imgs/a/b/c/1.jpg
flag:
	last:一旦此rewirte规则重写完成后,就不再被后面其它的rewirte规则进行处理,而是由user agent 重新对重写后的规则发起请求,从头开始执行类似过程
	break:一旦此rewirte重写完成后,由user agent对新的url重新发起请求,且不再对当前location内的任意rewirte规则所检查
			rewirte ^/images/(.*\.jpg)$  /imgs/$1 break;
			rewite ^/imgs/(.*\.jpg)$ /images/$1 break;
			类似于这样的循环时会用到break
	redirect:以302响应码(临时重定向)返回新的url
	permanent:以301响应码返回新的url

举例1:
在这里插入图片描述
在这里插入图片描述
访问172.25.44.1:8080/bbs/
注意/bbs/最后面的斜线一定要有
在这里插入图片描述
举例2:
在这里插入图片描述
客户端访问,可以看到响应码为302,location为https://www.wtt.com:
在这里插入图片描述
13、if

语法:if condition {...}
应用环境:server ,location
condition:
	(1)变量名
	变量值为空字符串,或以“0“开始则为false,其它的均为true
	(2)以变量为操作数构成的表达式
	可以使用=,!=类似的比较操作符进行测试
	(3)正则表达式的模式匹配操作
	~:区分大小写的模式匹配检查
	~*:不区分大小写
	!~和!~*:对上面两种匹配模式取反
	(4)测试路径为文件可能性:-f,!-f
	(5)测试路径为目录的可能性:-d,!-d
	(6)测试文件存在的可能性 -e ,!-e
	(7)检查文件是否有执行权限-x ,!-x
	例如:
	(1)if ($http_user_agent ~* MSIE) {
			rewrite ^(.*)$  /mise/$1 break;
			}

			http_user_agen表示获取用户浏览器类型

14、防盗链

location ~* \.(jpg|gif|jpeg|png)$ {
	valid_referer none blocked www.wtt.com;   #这里定义合法的应用者
	if ($invalid_referer) {  #如果不合法的引用者存在
		rewirte ^/ http://www.wtt.com/403.html;
		}
}

15、定制访问日志格式
log_format
$time_local:本地时间

   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;

16、网络连接相关配置:

keepalive_timeout #;  长连接超时时长,默认75秒;
keepalive_requests #; 在一个长连接上所能够允许请求的最大资源数;
keepalive_disable {msie6|safari|none};为指定的user agent禁用长连接
tcp_nodelay on|off; 是否对长连接使用tcp_nodelay选项
client_header_timeout #;读取http请求报文首部的超时时长
client_body_timeout #; 读取http请求报文body部分的超时时长
send_timeout #;发送响应报文的超时时长

17、fastcgi的相关模块

	LNMP:php启用fpm模型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值