深圳网站设计是什么,免费的个人简历电子版,wordpress地图无插件,推荐十个网站前言
nginx作为当今火爆的、高性能的http及反向代理服务#xff0c;不管前端还是后端#xff0c;都需要全面去了解#xff0c;学习#xff0c;实操。
nginx 介绍
为了有一个全面的认知#xff0c;接下来我们先来看看nginx的架构以及一些特点。
nginx 特点
处理响应请…前言
nginx作为当今火爆的、高性能的http及反向代理服务不管前端还是后端都需要全面去了解学习实操。
nginx 介绍
为了有一个全面的认知接下来我们先来看看nginx的架构以及一些特点。
nginx 特点
处理响应请求快异步非阻塞I/O零拷贝mmap缓存机制扩展性好模块化设计内存消耗低异步非阻塞多阶段处理具有很高的可靠性无数次的生产验证很多头部公司都在用热部署高并发连接事件驱动模型多进程机制自由的BSD许可协议可以自己修改代码后发布包容性极强
nginx模块
nginx服务器由n多个模块组成每个模块就是一个功能某个模块只负责自身的功能所以说对于 “高内聚低耦合“ 的编程规则在nginx身上可谓体现的淋漓尽致。 Nginx模块名称模块作用ngx_http_access_module四层基于IP的访问控制可以通过匹配客户端源IP地址进行限制ngx_http_auth_basic_module状态页使用basic机制进行用户认证在编译安装nginx的时候需要添加编译参数–withhttp_stub_status_module否则配置完成之后监测会是提示语法错误ngx_http_stub_status_module状态统计模块ngx_http_gzip_module文件的压缩功能ngx_http_gzip_static_module静态压缩模块ngx_http_ssl_modulenginx 的https 功能ngx_http_rewrite_module重定向模块解析和处理rewrite请求ngx_http_referer_module防盗链功能基于访问安全考虑ngx_http_proxy_module将客户端的请求以http协议转发至指定服务器进行处理ngx_stream_proxy_moduletcp负载将客户端的请求以tcp协议转发至指定服务器处理ngx_http_fastcgi_module将客户端对php的请求以fastcgi协议转发至指定服务器助理ngx_http_uwsgi_module将客户端对Python的请求以uwsgi协议转发至指定服务器处理ngx_http_headers_module可以实现对头部报文添加指定的key与值ngx_http_upstream_module负载均衡模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能ngx_stream_upstream_module后端服务器分组转发、权重分配、状态监测、调度算法等高级功能ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理ngx_http_flv_module为flv伪流媒体服务端提供支持
核心模块 是nginx 服务器正常运行必不可少的模块提供错误日志记录、配置文件解析、事件驱动 机制、进程管理等核心功能
标准HTTP模块 提供 HTTP 协议解析相关的功能如端口配置、网页编码设置、HTTP 响应头设 置等
可选HTTP模块 主要用于扩展标准的 HTTP 功能让nginx能处理一些特殊的服务如Flash 多 媒体传输、解析 GeoIP 请求、SSL 支持等
邮件服务模块 主要用于支持 nginx 的邮件服务包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持
第三方模块 是为了扩展 Nginx 服务器应用完成开发者自定义功能如Json 支持、Lua 支持等
nginx常见应用场景
反向代理负载均衡缓存限流黑/白名单静态资源服务动静分离防盗链跨域高可用
反向代理
使用一台代理服务器下图中的深色服务器对底层的应用服务器下图中的浅色服务器进行代理。将他们的地址信息对客户端屏蔽客户端只需要访问代理服务器即可代理服务器会将请求转发给底层的真正起作用的应用服务器。但在客户端眼里服务器只有唯一的一台就是代理服务器。 最近又赶上跳槽的高峰期招聘旺季好多读者都问我有没有面试题神器我苦苦整了一份内部资料《互联网大厂面试题Java3套知识精华》并分类 4 份 PDF累计 926 页
Linux保姆级教程|互联网大厂面试题|算法小抄
nginx.conf文件解读
nginx.conf 这个文件是 nginx 的核心配置一共由三部分组成分别为全局块、events块和http块。
默认配置文件
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {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 on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80; #监听的端口server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apaches document root# concurs with nginxs one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
结构说明
全局模块
event模块
http模块upstream模块server模块location块location块....server模块location块location块.......
各模块的功能作用如下描述
全局模块 配置影响nginx全局的指令比如运行nginx的用户名nginx进程pid存放路径日志存放路径配置文件引入worker进程数等。events块 配置影响nginx服务器或与用户的网络连接。比如每个进程的最大连接数选取哪种事件驱动模型select/poll epoll或者是其他等等nginx支持的来处理连接请求是否允许同时接受多个网路连接开启多个网络连接序列化等。http块 可以嵌套多个server配置代理缓存日志格式定义等绝大多数功能和第三方模块的配置。如文件引入mime-type定义日志自定义是否使用sendfile传输文件连接超时时间单连接请求数等。server块 配置虚拟主机的相关参数比如域名端口等等一个http中可以有多个server。location块 配置url路由规则upstream块 配置上游服务器的地址以及负载均衡策略和重试策略等等
配置示例
########### 每个指令必须有分号结束。#################
#配置用户或者组默认为nobody nobody以什么用户启动 nginx程序涉及到文件的读写权限一般应该用root。
user root; #允许生成的进程数默认为1。标配一个cpu起一个进程。
worker_processes auto; #指定nginx进程运行文件存放地址
pid /nginx/pid/nginx.pid; #制定日志路径级别。这个设置可以放入全局块http块server块级别以此为debug|info|notice|warn|error|crit|alert|emerg
#error_log log/error.log debug; events {#设置网路连接序列化防止惊群现象发生默认为on#accept_mutex on; #设置一个进程是否同时接受多个网络连接默认为off#multi_accept on; #事件驱动模型select|poll|kqueue|epoll|resig|/dev/poll|eventport#use epoll; #最大连接数可以根据实际情况扩大生产可扩大到10240worker_connections 10240;
}http {#文件扩展名与文件类型映射表include mime.types; #默认文件类型默认为text/plaindefault_type application/octet-stream; #取消服务日志#access_log off; #自定义格式 #log_format myFormat $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; #combined为日志格式的默认值#access_log log/access.log myFormat; #允许sendfile方式传输文件默认为off可以在http块server块location块。sendfile on; #每个进程每次调用传输数量不能大于设定的值默认为0即不设上限。sendfile_max_chunk 100k; #连接超时时间默认为75s可以在httpserverlocation块。keepalive_timeout 75; #接收客户端请求体超时client_body_timeout 20s;#客户端连接nginx超时, 建议5s内,接收客户端header超时时间,超时返回408client_header_timeout 10s;#限制请求体的大小若超过所设定的大小返回413错误。client_max_body_size 10M;#Nginx分配给请求数据的Buffer大小如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。#大于该值小于client_max_body_size就会将数据先存储到临时文件用户组要有读写权限中client_body_temp 指定的路径中默认该路径值是/tmp/。client_body_buffer_size 128k;#开启自定义错误重定向不存在会返回404页面fastcgi_intercept_errors on;#热备upstream mysvr { server 127.0.0.1:7878;server 192.168.10.121:3333 backup; }server {#单连接请求上限次数。keepalive_requests 120; #监听端口listen 4545; #监听地址 server_name 127.0.0.1; #请求的url过滤正则匹配~为区分大小写~*为不区分大小写。 location ~*^.$ { #根目录,设置目录#root path; #设置默认页#index index.htm; #请求转向mysvr 定义的服务器列表proxy_pass http://mysvr; #拒绝的ip#deny 127.0.0.1; #允许的ip#allow 172.18.5.54; } }
}
location 路由匹配规则
nginx根据用户请求的URI来匹配对应的location模块匹配到哪个location请求将被哪个location块中的配置项所处理。
location配置语法location [修饰符] pattern {…}
常见匹配规则如下
修饰符作用空无修饰符的前缀匹配匹配前缀是 你配置的比如说你配的是 /aaa 的url精确匹配~正则表达式模式匹配区分大小写~*正则表达式模式匹配不区分大小写^~^~类型的前缀匹配类似于无修饰符前缀匹配不同的是如果匹配到了那么就停止后续匹配/通用匹配任何请求都会匹配到只要你域名对所有请求通吃
以上规则简单总结就是优先级从高到低依次为序号越小优先级越高
1. location # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配区分大小写
4. location ~* # 正则匹配不区分大小写
5. location /a # 普通前缀匹配优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的都会匹配这里处理前缀匹配无修饰符
这种方式最常用
server {location /api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:48080/;}
}
前缀匹配 ^~
^~ 表示 uri 以某个字符串开头
location ^~ /static/ {default_type text/plain;return 200 hello;
}
#curl http://127.0.0.1:2880/static/aa正则匹配~ 区分大小写
location ~ ^/document$ {default_type text/plain;return 200 hello;
}
#curl http://127.0.0.1:2880/document正则匹配~* 不区分大小写
location ~* ^/document$ {default_type text/plain;return 200 hello;
}#curl http://127.0.0.1:2880/document
#curl http://127.0.0.1:2880/DOCUMENT通用匹配 /
通用匹配使用一个 / 表示可以匹配所有请求一般nginx配置文件最后都会有一个通用匹配规则当其他匹配规则均失效时请求会被路由给通用匹配规则处理如果没有配置通用匹配并且其他所有匹配规则均失效时nginx会返回404错误。
location / {root html;index index.html index.htm;
}反向代理配置
server {listen 8279;location / { proxy_pass http://ip:6020;}
}
负载均衡
把www.domain.com均衡到本机不同的端口也可以改为均衡到不同的地址上
http {upstream myproject {ip_hash;server 127.0.0.1:8000 weight3;server 127.0.0.1:8001;server 127.0.0.1:8002;server 127.0.0.1:8003;}server {listen 80;server_name www.domain.com;location / {proxy_pass http://myproject;}}
}Nginx常用的负载策略
负载策略描述特点轮询默认方式1. 每个请求会按时间顺序逐一分配到不同的后端服务器 2. 在轮询中如果服务器down掉了会自动剔除该服务器 3. 缺省配置就是轮询策略 4. 此策略适合服务器配置相当无状态且短平快的服务使用weight权重方式1. 在轮询策略的基础上指定轮询的几率 2. 权重越高分配到的请求越多 3. 此策略可以与least_conn和ip_hash结合使用 4. 此策略比较适合服务器的硬件配置差别比较大的情况ip_hash依据ip的hash值来分配1. 在nginx版本1.3.1之前不能在ip_hash中使用权重weight 2. ip_hash不能与backup同时使用 3. 此策略适合有状态服务比如session 4. 当有服务器需要剔除必须手动down掉least_conn最少连接方式1. 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况fair第三方响应时间方式1. 根据后端服务器的响应时间来分配请求响应时间短的优先分配 2. Nginx本身不支持fair如果需要这种调度算法则必须安装upstream_fair模块url_hash第三方依据URL分配方式1. 按访问的URL的哈希结果来分配请求使每个URL定向到一台后端服务器 2. Nginx本身不支持url_hash如果需要这种调度算法则必须安装Nginx的hash软件包
缓存
nginx代理缓存可以在某些场景下有效的减少服务器压力让请求快速响应从而提升用户体验和服务性能。
指令名称作用解释语法默认配置示例作用域proxy_cache设置是否开启对后端响应的缓存。proxy_cache zone | off;proxy_cache off;proxy_cache mycache; # 规定开启nginx缓存并且缓存名称为: mycachehttp, server, locationproxy_cache_valid配置什么状态码可以被缓存以及缓存时长proxy_cache_valid [code …] time;没有默认值proxy_cache_valid 200 304 2m; # 对于状态为200和304的缓存文件缓存时间是2分钟http, server, locationproxy_cache_key设置缓存文件的 keyproxy_cache_key string;proxy_cache_key schemeschemeschemeproxy_host$request_uri;proxy_cache_key “hosthosthostrequest_uri $cookie_user”; # 使用host 请求的uri以及cookie拼接成缓存keyhttp, server, locationproxy_cache_path指定缓存存储的路径文件名为cache key的md5值然后多级目录的话根据level参数来生成key_zone参数用来指定在共享内存中缓存数据的名称和内存大小比如keys_zonemycache:100minactive用来指定缓存没有被访问后超时移除的时间默认是10分钟也可以自己指定比如inactive2h max_size 用来指定缓存的最大值超过这个值则会自动移除最近最少使用lru淘汰算法的缓存 这个指令对应的参数很多具体见官网proxy_cache_pathproxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [min_freesize] [manager_filesnumber] [manager_sleeptime] [manager_thresholdtime] [loader_filesnumber] [loader_sleeptime] [loader_thresholdtime] [purgeron|off] [purger_filesnumber] [purger_sleeptime] [purger_thresholdtime];无proxy_cache_path /data/nginx/cache levels1:2 keys_zonemycache:128m inactive3d max_size2g; # 设置缓存存放的目录为/data/nginx/cache并设置缓存名称为mycache大小为128m 三天未被访问过的缓存将自动清除磁盘中缓存的最大容量为2GB。httpproxy_cache_bypass定义不从缓存中获取响应数据的条件。如果字符串参数中至少有一个值不为空且不等于 0 则不会从缓存中获取响应:proxy_cache_bypass string …;没有默认值proxy_cache_bypass cookienocachecookie_nocache cookienocachearg_nocache$arg_comment;http, server, locationproxy_cache_min_uses指定某一个相同请求在几次请求之后才缓存响应内容proxy_cache_min_uses number;proxy_cache_min_uses 1;proxy_cache_min_uses 3; 规定某一个请求在第3次之后才走nginx缓存http, server, locationproxy_cache_use_stale指定后端服务器在返回什么状态码的情况下可以使用过期的缓存proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 … |off ;proxy_cache_use_stale off;proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; # 规定服务在出现error timeout,以及502,503,504时可使用过期缓存http, server, locationproxy_cache_lock默认不开启开启后若出现并发重复请求nginx只让一个请求去后端读数据其他的排队并尝试从缓存中读取;proxy_cache_lock on |off;proxy_cache_lock off;proxy_cache_lock on; # 开启缓存锁http, server, locationproxy_cache_lock_timeout等待缓存锁(proxy_cache_lock)超时之后将直接请求后端且结果不会被缓存proxy_cache_lock_timeout time;proxy_cache_lock_timeout 5s;proxy_cache_lock_timeout 6s; # 等待缓存锁超时6ms之后将直接请求后端结果不会被缓存。http, server, locationproxy_cache_methods如果客户端请求方法在该指令中则响应将被缓存。“GET”和“HEAD”方法总是被添加到列表中尽管建议显式地指定它proxy_cache_methods GET|HEAD |POST …;proxy_cache_methods GET HEAD;proxy_cache_methods GET HEAD PUT POST; # 规定 可缓存的方法有 get head put posthttp, server, location………………
修改配置文件
http{...# 指定缓存存放目录为/usr/local/nginx/test/nginx_cache_storage并设置缓存名称为mycache大小为64m 1天未被访问过的缓存将自动清除磁盘中缓存的最大容量为1gbproxy_cache_path /usr/local/nginx/test/nginx_cache_storage levels1:2 keys_zonemycache:64m inactive1d max_size1g;...server{...# 指定 username 参数中只要有字母 就不走nginx缓存 if ($arg_username ~ [a-z]) {set $cache_name no cache;}location /interface {proxy_pass http://myserver/;# 使用名为 mycache 的缓存空间proxy_cache mycache;# 对于200 206 状态码的数据缓存2分钟proxy_cache_valid 200 206 1m;# 定义生成缓存键的规则请求的url参数作为缓存keyproxy_cache_key $host$uri$is_args$args;# 资源至少被重复访问2次后再加入缓存proxy_cache_min_uses 3;# 出现重复请求时只让其中一个去后端读数据其他的从缓存中读取proxy_cache_lock on;# 上面的锁 超时时间为4s超过4s未获取数据其他请求直接去后端proxy_cache_lock_timeout 4s;# 对于请求参数中有字母的 不走nginx缓存proxy_no_cache $cache_name; # 判断该变量是否有值如果有值则不进行缓存没有值则进行缓存# 在响应头中添加一个缓存是否命中的状态便于调试add_header Cache-status $upstream_cache_status; }...
}
限流
Nginx主要有两种限流方式按并发连接数限流(ngx_http_limit_conn_module)、按请求速率限流(ngx_http_limit_req_module 使用的令牌桶算法)。
按请求速率限流
http{...# 对请求速率限流limit_req_zone $binary_remote_addr zonemyRateLimit:10m rate5r/s;server{location /interface{...limit_req zonemyRateLimit burst5 nodelay;limit_req_status 520;limit_req_log_level info;}}
}
$binary_remote_addr表示基于 remote_addr(客户端IP) 来做限流 zonemyRateLimit:10m表示使用myRateLimit来作为内存区域存储访问信息的名字大小为10M1M能存储16000 IP地址的访问信息10M可以存储16W IP地址访问信息
rate5r/s表示相同ip每秒最多请求5次nginx是精确到毫秒的也就是说此配置代表每200毫秒处理一个请求这意味着自上一个请求处理完后若后续200毫秒内又有请求到达将拒绝处理该请求如果没配burst的话 burst5意思是设置一个大小为5的缓冲队列若同时有6个请求到达Nginx 会处理第一个请求剩余5个请求将放入队列然后每隔200ms从队列中获取一个请求进行处理。若请求数大于6将拒绝处理多余的请求直接返回503 nodelay针对的是 burst 参数burst5 nodelay 这个配置表示被放到缓冲队列的这5个请求会立马处理不再是每隔200ms取一个了。但是值得注意的是即使这5个突发请求立马处理并结束后续来了请求也不一定不会立马处理因为虽然请求被处理了但是请求所占的坑并不会被立即释放而是只能按 200ms 一个来释放释放一个后 才将等待的请求 入队一个。 另外两个 limit_req_status520表示当被限流后nginx的返回码limit_req_log_level info代表日志级别
按并发连接数限流
http{# 针对ip 对请求连接数限流...limit_conn_zone $binary_remote_addr zonemyConnLimit:10m; ...server{...limit_conn myConnLimit 12;}
}
limit_conn_zone $binary_remote_addr zonemyConnLimit:10m; 代表的意思 是 基于连接数量限流限流的对象是ip 名称是myConnLimit 存储空间大小10mb即存放某ip的访问记录limit_conn myConnLimit 12;标识该ip最大支持12个连接超过则返回503
https配置
https_ssl模块安装
需要下载源码
wget http://nginx.org/download/nginx-1.23.0.tar.gz解压后编译 ./configure --prefix/usr/local/nginx --with-http_ssl_modulemake make install查看版本
nginx -V出现 --with-http_ssl_module 代表安装了ssl模块。
证书可以自己生成免费证书也可以购买。
配置https server {listen 8080 ssl;server_name localhost;ssl_certificate /home/nginx/cert/test.crt;ssl_certificate_key /home/nginx/cert/test.key;root html/dist;charset utf-8;}压缩
http {# 开启/关闭 压缩机制gzip on;# 根据文件类型选择 是否开启压缩机制gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/jpg image/gif image/png application/json;# 设置压缩级别一共9个级别 1-9 越高资源消耗越大 越耗时但压缩效果越好gzip_comp_level 9;# 设置是否携带Vary:Accept-Encoding 的响应头gzip_vary on;# 处理压缩请求的 缓冲区数量和大小gzip_buffers 32 64k;# 对于不支持压缩功能的客户端请求 不开启压缩机制gzip_disable MSIE [1-6]\.; # 比如低版本的IE浏览器不支持压缩# 设置压缩功能所支持的HTTP最低版本gzip_http_version 1.1;# 设置触发压缩的最小阈值gzip_min_length 2k;# off/any/expired/no-cache/no-store/private/no_last_modified/no_etag/auth 根据不同配置对后端服务器的响应结果进行压缩gzip_proxied any;
}
Spring Cloud Alibaba开发手册真香 Spring Cloud Alibaba为分布式应用开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件可以轻松地使用Spring Cloud开发应用程序。
最近抽空整理了一份Spring Cloud Alibab学习笔记免费分享给大家目录如下