Nginx总结
-1.前言
之前一直咕掉了, 这次把许多优质内容总结下,许多来自其他大佬的文章,底部有文章链接。
- 反向代理
- 负载均衡
- 动静分离
0.基本介绍
1.Web 服务器:
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
2.负载均衡服务器
支持作为 HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
3.作为邮件代理服务器
Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验.
4.优势
安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器, Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
1.基础内容
nginx #启动nginx
nginx -s reload #根据最新配置重启nginx
nginx -s stop #立即停止nginx
nginx -s quit #安全退出
nginx -c /特定目录/nginx.conf #以指定配置启动nginx
nginx -t #检查配置是否正确
nginx -t -c /特定目录/nginx.conf #检查特定配置是否正确
nginx -v #查看版本信息Nginx默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。
- main:主要控制Nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
- events:控制Nginx处理连接的方式。
- http:Nginx处理http请求的主要配置块。
- server:Nginx中主机配置块,可用于配置多个虚拟主机。
- location:server中对应目录级别的控制块,可以有多个。
(0)关于nginx配置的一些说明
| 语句 | 说明 |
|---|---|
| user nginx nginx ; | Nginx用户及组:用户 组。window下不指定 |
| worker_processes 8; | 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。 |
| error_log logs/error.log; | 错误日志:存放路径。 |
| pid logs/nginx.pid; | pid(进程标识符):存放路径。 |
| worker_rlimit_nofile 204800; | 指定进程可以打开的最大描述符:数目。现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 |
| use epoll; | 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 |
| worker_connections 204800; | 没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections |
| keepalive_timeout 60; | keepalive超时时间。 |
| client_header_buffer_size 4k; | 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 |
| include mime.types; | 设定mime类型,类型由mime.type文件定义 |
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add$拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
#运行用户
user nobody;
#工作进程数
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
}
http {
#设定mime类型,类型由mime.type文件定义
include 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 logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
(1)关于location
其中location根据不同前缀的使用方式,大致分为普通location和正则location。多个正则location之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的location。多个普通location之间遵循“最大匹配原则”,匹配度最高的location将会被执行,同时也可以利用 =精准匹配和 ^非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。因此 当多种类型的 location 匹配同时出现时,最终执行结果为“= ”匹配优先于”^“匹配,“^~”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的location 匹配成功,就不会执行其他的location 。
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
即:此模块专门将请求导向其他服务。
语法
1.精确匹配
location = / {
#精确匹配访问网站根目录
}
location = /login {
#精确匹配http://xxx.com/login
}2. ^~ 表示以什么打头,关键在于正则的开头符 ^
location ^~ /static/ {
#以/static打头,比如 http://xxx.com/static/jQuery.js
}3. 正则匹配(~ 区分大小写的正则, ~* 不区分大小的正则)
location ~ \.png {
#以png结尾,比如比如 http://xxx.com/img/a.png
}
location ~* \.png$ {
#以png或者PNG或者Png等等结尾,比如比如 http://xxx.com/img/a.pNg。如果是png结尾,会优先匹配上面一条。
}4.排除法的正则,同样区分大小写优先于不区分大小写
location !~ \.png$ {
#匹配“以png结尾”失败,进入location,那就情况多了去了,只要不以png结尾就行
}
location !~* \.xhtml$ {
#匹配“以png或者PNG或者PnG等等”结尾失败,进入location,那情况也多了去了,只要不是PNG的各种大小写变体就行
}5. 通用匹配
location / {
#用来兜底的,当前面其他所有的规则都不满足条件,就归入这个通用的
}总结就是如果$proxy_pass$ 结尾加上$/$则是绝对根路径,不会把匹配的路径部分带走,否则会带走。
(2)缓冲
nginx也提供了缓冲的机制,用于提高性能。没有缓冲的情况下,数据直接从后端服务器发送给客户端。缓冲的作用是在nginx上临时存储来自后端服务器的处理结果,从而可以提早关闭nginx到后端的连接,减少IO的损耗。一般内容存放在内存当中,但当内容过多,造成的内存不够时,会把内容存放在临时文件目录下。
(3)nginx配置多个配置文件
需要在server中加:include config/*.conf;
(4)跨域
跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
2.反向代理
对于一个大型网站来说,随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须以增加服务器的方式,提高计算机系统的处理能力,计算速度,进而满足当前业务量的需求。那么如何实现服务器之间的协同功能呢?Nginx提供的反向代理和负载均衡功能是一个很好的解决方案。
nginx的代理过程,就是将请求发送给nginx,然后将请求转发给后端服务器,后端服务器处理完毕之后将结果再发给nginx,nginx再把结果发送给客户端。后端服务器可在远程也可在本地,也可以是nginx服务器内部定义的其他虚拟主机。这些接收nginx转发的服务器被称为上游(upstream)使用nginx做代理的目的之一是扩展基础架构的规模。nginx可以处理大量并发连接,请求到来后,nginx可将其转发给任意数量的后台服务器进行处理,这等于将负载均衡分散到整个集群。
在Nginx服务器中,反向代理的配置非常简单,最主要的指令就是“proxy_pass”,用于设置后端服务器的地址。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:9000;
}
}3.负载均衡
负载均衡就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。
Nginx默认支持轮询、权重、ip Hash等多种负载均衡策略。
- 轮询:默认设置方式,每个请求按时间顺序逐一分配到不同的后端服务器进行处理,可以自动剔除宕机服务器。
- 权重方式:利用weight指定轮询的权重比率,用于后端服务器性能不均的情况。
- ip_hash方式:每个请求按照IP的hash结果分配,这样可以让每个访客每次请求都访问同一个后端服务器,可以解决session共享的问题。
- 第三方模块:fair或url_hash等策略,nginx本身不包含该实现,需要下载对应的软件包。
客户端访问nginx的时候,只需要配置一个ip和一个端口,nginx帮助我们把请求转发不同的后台服务中。
如上配置 所有 http://localhost:80的请求都会被转发到http://localhost:9000。
轮询配置
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web_server;
}
}
#配置负载均衡服务器组 轮询方式
upstream web_server
{
server 192.168.78.128;
server 192.168.78.129;
}权重方式配置
upstream web_server1
{
server 192.168.78.128 weight=1;
server 192.168.78.129 weight=3;
}
upstream web_server2
{
server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2;
server 192.168.78.129 weight=3;
server 192.168.78.130 backup;
}按上图web_server1配置后,3/4的流量会转发到192.168.78.129的服务器上,1/4的流量会转发到192.168.78.128的服务器上,web_server2的配置表示 nginx在2s内发现后端服务异常达到max_fails次,就将该服务器标记为不可用。backup标记为预留的备份机器,当上面上个服务都宕机时,会将流量转发到备份机器。
IP Hash方式
upstream web_server1
{
ip_hash;
server 192.168.78.128;
server 192.168.78.129;
server 192.168.78.130 down;
}down参数可以将服务器标记为下线状态,在路由分配时,会忽略该服务器。
参考文章
https://blog.csdn.net/qinqinde123/article/details/89448076
https://blog.csdn.net/tjcyjd/article/details/50695922





