最近看了蛮多 Nginx 的书、文档等,适当的总结下一些基础扫盲知识。
刚上班就晓得有 Apache 这个东西,也维护过一段时间,后面就默默的转 DBA 了,从而其实错过了 Nginx ,最近想着扫扫盲,学学、玩玩、看看、补补 。
Nginx、OpenRestry、Kong
- Nginx 是模块化设计的反向代理软件,C语言开发
- OpenResty 是以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本
- Kong 是 OpenResty 的一个应用,是一个 API 网关,具有API管理和请求代理的功能
上面三点其实就能很明显的发现,讲到底还是 Nginx。
OpenResty
OpenResty 以 Nginx 为核心,集成打包了众多侧重于高性能 Web 开发的外围组件,它既是一个Web Server,也是一个成熟完善的开发套件。OpenResty 基于Nginx 和 Lua/LuaJIT,充分利用了两者的优势,能够无阻塞地处理海量并发连接,任意操纵 HTTP/TCP/UDP 数据流,而且功能代码不需要编译,可以就地修改脚本并运行,简化了开发流程,加快了开发和调试的速度,同时也缩短了开发周期,在如今这个快节奏的时代里弥足珍贵。
简易配置
worker_processes auto;
worker_cpu_affinity auto;
worker_priority -10;
error_log /data/nginx/logs/error.log;
error_log /data/nginx/logs/error.log notice;
error_log /data/nginx/logs/error.log info;
pid /data/nginx/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream mysqld {
server xxxxx:3306;
}
server {
listen 23430;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass mysqld;
}
}
http {
lua_shared_dict prometheus_metrics 10M;
lua_package_path '/etc/openresty/conf.d/lua/?.lua;;';
init_by_lua_block {
prometheus = require("prometheus").init("prometheus_metrics")
metric_requests = prometheus:counter(
"nginx_http_requests_total", "Number of HTTP requests", {"host", "status"})
metric_latency = prometheus:histogram(
"nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
metric_connections = prometheus:gauge(
"nginx_http_connections", "Number of HTTP connections", {"state"})
}
log_by_lua_block {
metric_requests:inc(1, {ngx.var.server_name, ngx.var.status})
metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
}
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 /data/nginx/logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
server {
listen 23431;
access_log off;
# Allow all RFC 1918 address blocks
# allow 10.0.0.0/8;
# allow 172.16.0.0/12;
# allow 192.168.0.0/16;
# deny all;
location /nginx_status {
stub_status;
}
}
server {
listen 23432;
access_log off;
# Allow all RFC 1918 address blocks
# allow 10.0.0.0/8;
# allow 172.16.0.0/12;
# allow 192.168.0.0/16;
# deny all;
location /metrics {
content_by_lua_block {
metric_connections:set(ngx.var.connections_active, {"active"})
metric_connections:set(ngx.var.connections_reading, {"reading"})
metric_connections:set(ngx.var.connections_writing, {"writing"})
metric_connections:set(ngx.var.connections_waiting, {"waiting"})
prometheus:collect()
}
}
}
server {
listen 23433;
server_name Nginx;
#charset koi8-r;
access_log /data/nginx/logs/host.access.log main;
location / {
default_type text/html;
content_by_lua 'ngx.say("<p>hello, world</p>")';
}
#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;
}
location /baidu {
rewrite ^/(.*) http://www.baidu.com;
root html;
index index.html;
}
}
日常覆盖场景
- 与 PHP 配合完成 PHP-CGI 的动态配合,PHP 自带一个 Nginx
- 7 层转发,公有云 ELB/SLB 就有这样能力,用户流量先打到这层接着转发到后端 Nginx 集群
- 内部服务api 接入层,如果架构不合理,就会有很多的 localtion rewrite 想想就很酸爽
- 4 层转发,默认不推荐,因为有更好的 Lvs
Location & Rewrite
- location 有”定位”的意思, 根据 uri 来进行不同的定位,可以把网站的不同部分,定位到不同的处理方式上。比如,遇到 .php 就转发到 php-cgi 去 ; 还可以配置优先级
- rewrite 顾名思义就是重定向。使用 nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url 重写以及重定向。
优先级规则
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项 「先判断精准命中,如果命中,立即返回结果并结束解析过程」
- 前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个 「若未结束,判断前缀普通命中,如果有多个命中,使用表达式“最长”的命中结果,结束解析过程」
- 正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项 「若未结束,继续判断正则表达式的匹配,按正则表达式顺序为准,由上至下一旦匹配成功1个,立即返回结果,并结束解析过程」
- 常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个 「若未结束,继续普通命中,普通命中和前缀普通命中相似,顺序无所谓,按照location表达式的长短来确定命中结果」
301 & 302 跳转
- 301 永久跳转:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
- 302 临时跳转:请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
基于 Lua 可以让 nginx 做更多的事情,ng 本身还是一个插件性的 web server,完全可以基于服务场景来进行二次的插件开发「前提有人会 C++」,本人的理解是普通公司的话 OpenResty 已经可以满足绝大部分场景,而且 Lua 本身也不难,运维基本上都应该适当学习很快就可以上手的一个语言。「sysbench 里面不就是有好多 Lua 」,此文档为个人总结摘录,为了一些技术知识的个人总结为主 「入门扫盲阶段」。
网友评论