TFS Nginx模块实现

合集下载

Nginx开发和配置教程

Nginx开发和配置教程

Nginx开发和配置教程一、Nginx的开发1. Nginx模块开发-编写模块的配置指令:模块的配置指令决定了模块如何被配置和使用。

-实现模块的处理函数:处理函数负责处理来自客户端的请求并返回响应。

- 注册模块:将模块注册到Nginx的配置中。

2. Nginx的事件驱动模型-事件模块:负责监听和接收客户端请求。

-连接池:管理与客户端的连接。

-请求处理:负责处理客户端的请求并返回响应。

二、Nginx的配置1. Nginx配置文件2. Nginx的基本配置指令- worker_processes:指定Nginx的工作进程数,用于处理并发请求。

- pid:指定Nginx的进程ID文件路径。

- error_log:指定错误日志文件的路径。

- access_log:指定访问日志文件的路径。

- events:指定Nginx的事件模块配置。

3. Nginx的虚拟主机配置- server:定义一个虚拟主机。

- listen:指定虚拟主机监听的端口。

- server_name:指定虚拟主机的域名。

- root:指定虚拟主机的根目录。

4. Nginx的负载均衡配置- upstream:定义一个负载均衡服务器组。

- server:定义一个后端服务器。

- weight:指定后端服务器的权重,用于分配请求。

- ip_hash:根据客户端IP地址进行负载均衡。

总结:本文介绍了Nginx的开发和配置教程。

在Nginx的开发方面,我们了解了Nginx的模块开发和事件驱动模型。

在Nginx的配置方面,我们了解了Nginx的配置文件,基本配置指令,虚拟主机配置和负载均衡配置。

希望这些内容能帮助您更好地开发和配置Nginx服务器。

nginx模块开发

nginx模块开发
nginx模块开发
By 薛长俊 2013-11
Nginx模块开发
模块化 daemon 编码规范
模块化
• 模块分类
handlers,处理http请求并构造输出 filters,处理handler产生的输出 load-balancers,当有多于一个的后端服务器时,选择一台将http请求发 送过去
模块化
daemon
• 编写Handler
Nginx允许handler一次产生一组输出,可以产生多次,Nginx将输出组织成一 个单链表结构,链表中的每个节点是一个chain_t。
daemon
• 组合Nginx Module
一个Nginx模块被定义为一个ngx_module_t结构,这个结构的字段很多,不 过开头和结尾若干字段一般可以通过Nginx内置的宏去填充,下面是我们 echo模块的模块主体定义:
模块化
• ngx_module_t,ngx_module_s
ngx_uint_t type; //用于区分core、event、http和mail。 ngx_int_t (*init_master)(ngx_log_t *log); //初始化master时执行 ngx_int_t (*init_module)(ngx_cycle_t *cycle); //初始化module时执行 ngx_int_t (*init_process)(ngx_cycle_t *cycle); //初始化process时执行 ngx_int_t (*init_thread)(ngx_cycle_t *cycle); //初始化thread时执行 void (*exit_thread)(ngx_cycle_t *cycle); //退出thread时执行 void (*exit_process)(ngx_cycle_t *cycle); //退出process时执行 void (*exit_master)(ngx_cycle_t *cycle); //退出master时执行 ....

Nginx模块开发文档

Nginx模块开发文档

nginx文档吴东April 28, 2009Contents1前言52基本配置72.1安装 (7)2.2配置说明 (10)2.3启动和控制 (25)3深入源码273.1源码结构 (27)3.2configure配置 (27)3.3nginx源码习惯 (27)3.4常用基础库 (28)3.5core模块 (40)3.6event模块 (44)3.7http模块 (46)4模块编写554.1http模块编写 (55)4.2基于nginx的高性能服务器开发. . . . . . . . . 555附录575.1编译器参数 (57)5.2系统函数 (59)CONTENTS CONTENTSChapter 1前言在互联网编程中,http服务器编程作为一个非常重要方向一直为各种语言所重视,从c语言的apache,Lighttpd到当前非常流行的nginx。

Java有tom-cat,jetty,websphere等众多服务器,pyhoen的zope等服务器。

既有重量级的服务器,又有轻量级的,嵌入式的服务器。

从互联网的应用来说,c语言的http 服务器一直占有主导地位,当前最流行的三个开源服务器有apache,Lighttpd和nginx。

Apache作为经典的Web服务器,除了慢没有别的缺点了,Apache2对fcgi支持并不好,非常好用的proxy和proxy_ajp (很多人用它作为tomcat的前端),不支持epoll(这年头,epoll几乎是性能的必备)。

Lighttpd作为杀手级的静态文件能力,杀手级的fcgi能力但是proxy模块不够稳定。

Nginx速度快,占用资源少,杀手级的proxy和rewrite,非常不错的静态文件能力,最适合作为整个网站的前端服务(将php、svn等不同请求发送往后端apache)。

现在国内Nginx的用户越来越多了,多数拥抱Nginx的网站都钟意其优异的性能表现,如果是相对比较大的网站,节约下来的服务器成本无疑是客观的。

nginxfastcgi_intercept_error模块编译

nginxfastcgi_intercept_error模块编译

nginxfastcgi_intercept_error模块编译如何编译nginxfastcgi_intercept_error模块。

编译Nginx时,我们有时候需要自定义一些模块以满足特定的需求。

其中一个常见的需求是拦截FastCGI错误。

为了实现这个功能,我们可以使用nginxfastcgi_intercept_error模块。

这个模块可以在FastCGI返回错误时,将错误信息传递给Nginx处理。

下面是一步一步的指南,来帮助你编译nginxfastcgi_intercept_error模块:步骤一:获取Nginx源代码首先,我们需要获取Nginx的源代码。

你可以在Nginx的官方网站上找到最新的源代码包。

下载并解压缩源代码包到你的开发环境中。

步骤二:进入Nginx源代码目录使用终端或命令行工具进入解压缩后的Nginx源代码目录。

步骤三:配置编译参数在进入源代码目录后,你需要对Nginx进行配置,以便添加nginxfastcgi_intercept_error模块。

首先,运行以下命令检查你的系统是否已经安装了必要的依赖项:./configure help这将列出所有可用的编译参数和选项。

浏览列表,查找和FastCGI相关的选项。

通常可以找到名为with-http_fastcgi_module 和add-module=PATH_TO_MODULE 的选项。

步骤四:添加nginxfastcgi_intercept_error模块为了添加nginxfastcgi_intercept_error模块,我们需要使用add-module选项。

假设你已经下载了这个模块并解压缩到你的开发环境中,那么你可以使用以下命令来添加模块:./configure add-module=PATH_TO_MODULE请将PATH_TO_MODULE替换为你实际模块的路径。

步骤五:编译和安装Nginx在完成配置后,你可以使用make命令编译Nginx。

Nginx+Tomcat配置

Nginx+Tomcat配置

Nginx+Tomcat配置为什么使用Nginx?Apache∙经典的Web服务器∙除了慢没有别的缺点了∙Apache2对fcgi支持并不好∙非常好用的proxy和proxy_ajp(很多人用它作为tomcat的前端)∙不支持epoll(这年头,epoll几乎是性能的必备)Nginx∙速度快,占用资源少∙杀手级的proxy和rewrite∙非常不错的静态文件能力∙最适合作为整个网站的前端服务(将php、svn等不同请求发送往后端apache)∙其他功能马马虎虎代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。

已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而被人们广泛使用了。

大多数人选择它主要考虑到的是它的高并发和负载均衡。

安装Nginx1. tar zxvf nginx0.8.36.tar.gz2、编译安装nginxcd nginx-0.7.44./configure --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/nginx执行后,可能会提示 ./configure: error: the HTTP rewrite module requires the PCRE library.这个错误,是缺少pcre 包,可用yum install pcre pcre-devlel来解决3、make && make install4、nginx安装成功后的安装目录为/usr/local/nginx5.编辑配置文件nginx.conf#user www www;worker_processes 8; #启动进程数,可根据机器核数来修改error_log /usr/local/nginx/logs/nginx_error.log crit; #全局错误日志及PID文件pid /usr/local/nginx/nginx.pid;worker_rlimit_nofile 65535;events{use epoll;worker_connections 65535; #工作模式及连接数上限}http #设定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; #定义的日志格式和存放路径#General Optionsserver_names_hash_bucket_size 128;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_body_buffer_size 8m; #256kserver_tokens off;ignore_invalid_headers on;recursive_error_pages on;server_name_in_redirect off;sendfile on;#timeoutskeepalive_timeout 60;#client_body_timeout 3m;#client_header_timeout 3m;#send_timeout 3m;#TCP Optionstcp_nopush on;tcp_nodelay on;#size limitsclient_max_body_size 50m;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.0;gzip_comp_level 2;gzip_types text/plain application/x-javascript text/css application/xml;gzip_vary on;upstream {ip_hash;server x.x.x.x:8080 max_fails=0 weight=1;server x.x.x.x:8080 max_fails=0 weight=1; #8080为tomcat端口 }server {listen 80 default;rewrite ^(.*) / permanent;#charset koi8-r;#access_log logs/host.access.log main;#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;}}server{listen 80;server_name ;index index.php index.html index.htm;root /http;access_log /data/logs/.log combined;error_log /data/logs/error_test.xxx.log;#expireslocation ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${expires 30d;}location ~ .*\.(js|css)?${expires 24h;}location /nginxstatus {stub_status on;access_log off;}# location ~ .*\.jsp?$location /{proxy_pass http://npduxiu;proxy_redirect off;# proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header Connection Close;proxy_set_header X-Forwarded-For $remote_addr; error_page 404 /404.html;error_page 500 502 503 504 /50x.html;# location = /50x.html {# root html;# }}}}6、修改/usr/local/nginx/conf/nginx.conf配置文件后,用命令/usr/local/nginx/sbin/nginx -t 检查配置文件是否正确:7、启动nginx的命令/usr/local/nginx/sbin/nginx8、停止nginx的命令/usr/local/nginx/sbin/nginx -s stop9、在不停止Nginx服务的情况下加载Nginx配置kill -HUP `cat /usr/local/nginx/nginx.pid`10.nginx网站开启后(已启用stub_stauts),可用/nginxstatus查看nginx状态active connections -- 对后端发起的活动连接数server accepts handled requests -- nginx 总共处理的连接, 成功创建了几次握手总共处理了多少个请求reading -- nginx 读取到客户端的Header信息数writing -- nginx 返回给客户端的Header信息数waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing)安装Tomcat下面开始Tomcat的安装了,那就更简单了,网上文档也是一大把Tomcat安装一、jdk的安装安装的jdk为:jdk-6u21-linux-x64.bin1.sh jdk-6u17-linux-x64-rpm.bin2.安装程序在问您是否愿意遵守刚才看过的许可协议。

nginx 菜鸟教程

nginx 菜鸟教程

nginx 菜鸟教程nginx是一款开源的Web服务器软件。

它具有高并发、高性能和低内存消耗等特点,适用于构建稳定可靠的大型网站和分布式应用。

nginx的安装及配置非常简单。

可以通过以下步骤来完成安装:1. 打开终端,使用以下命令安装nginx:```sudo apt-get updatesudo apt-get install nginx```2. 安装完成后,可以通过以下命令启动nginx:```sudo service nginx start```3. 默认情况下,nginx会监听80端口。

可以通过在浏览器中输入服务器的IP地址来访问nginx的欢迎页面,确认nginx是否正常工作。

nginx的配置文件位于/etc/nginx/nginx.conf。

可以使用任何文本编辑器打开该文件,对nginx进行配置。

在修改配置文件之前,建议先备份原始的配置文件。

除了nginx.conf之外,nginx还有一些辅助的配置文件和目录。

其中,sites-available目录中存放的是各个网站的配置文件,而sites-enabled目录中存放的是启用的网站配置文件的符号链接。

在配置nginx时,需要注意以下几点:1. 虚拟主机配置:可以为每个网站创建一个独立的虚拟主机配置文件,并使用server指令将其与特定域名或IP地址绑定。

2. 日志配置:可以配置nginx生成的访问日志和错误日志的路径和格式。

3. 反向代理配置:可以使用nginx作为反向代理服务器,将客户端请求转发给后端的应用服务器。

总的来说,nginx是一款功能强大且灵活的Web服务器软件,可以用于构建高性能的网站和应用。

通过合理配置nginx的各项参数和功能,可以满足不同场景下的需求。

CentOS 5下安装tfs并使用Nginx做访问

CentOS 5下安装tfs并使用Nginx做访问

CentOS 5下安装tfs并使用Nginx做访问看看新闻网>看引擎>系统运维操作系统环境[root@localhost ~]# uname -aLinux localhost.localdomain 2.6.18-371.9.1.el5 #1 SMP Tue Jun 10 17:49:56 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux[root@localhost ~]# cat /etc/issueCentOS release 5.10 (Final)Kernel \r on an \m[root@localhost ~]#PS:以下操作我只在如上系统进行验证使用,仅供参考1.更新yum源CentOS 5.6 更新yum源我这里使用的搜狐的源,博友们可以自己穿件源cd /etc/yum.repos.dmv CentOS-Base.repo CentOS-Base.repo.savewget /help/CentOS-Base-sohu.repoyum updateyum makecache2.安装高版本mysqlwget /epel/5/x86_64/epel-release-5-4.noarch.rpm wget/enterprise/5/remi/x86_64/remi-release-5.9-1.el5 .remi.noarch.rpmrpm -ivh *.rpmecho ‗priority=1′ >> /etc/yum.repos.d/remi.repoecho ‗priority=1′ >> /etc/yum.repos.d/epel-testing.repoecho ‗priority=1′ >> /etc/yum.repos.d/epel.repo检查mysql 是否有可升级版本。

发现有版本可以升级到mysql5.5.11。

nginx使用教程

nginx使用教程

nginx使用教程Nginx是一个高性能的、轻量级的Web服务器软件,也可以当做反向代理服务器、负载均衡器以及HTTP缓存服务器使用。

以下是Nginx的简单使用教程。

1. 安装Nginx:- 在Ubuntu上执行以下命令安装Nginx:```bashsudo apt updatesudo apt install nginx```- 在CentOS上执行以下命令安装Nginx:```bashsudo yum install epel-releasesudo yum install nginx```2. 启动Nginx:- 在Ubuntu上执行以下命令启动Nginx:```bashsudo systemctl start nginx```- 在CentOS上执行以下命令启动Nginx:```bashsudo service nginx start```3. 配置Nginx:- Nginx的主要配置文件是`nginx.conf`,位于`/etc/nginx`目录下。

- 在`nginx.conf`中,可以指定Nginx的工作模式、服务监听的端口、网站的根目录等等。

- 具体的配置可以参考官方文档或其他教程。

4. 配置虚拟主机:- Nginx可以同时管理多个网站,通过配置虚拟主机实现。

- 在`nginx.conf`或单独的配置文件中,使用`server`块配置每个虚拟主机的相关项,如域名、端口、根目录等等。

- 配置完成后,重启Nginx使得配置生效。

5. 添加反向代理:- Nginx可以作为反向代理服务器,将客户端的请求转发给后端服务器进行处理。

- 在虚拟主机的配置中,使用`proxy_pass`指令将请求转发到后端服务器的地址。

- 注意配置好反向代理的协议、负载均衡方式等。

6. 添加HTTP缓存:- Nginx可以作为HTTP缓存服务器,加速网站的访问。

- 在虚拟主机的配置中,使用`proxy_cache_path`指令指定缓存文件的存储路径。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– 生命周期:请求
• 共享内存
– 生命周期:nginx进程
16/26
接收buf
• Header buffer(共用) • 每个连接有各自的body buffer • 处理buf overflow情况
ngx_http_tfs_t
recv_chain header_buffer
ngx_chain_t
buf next
• BatchGetBlockInfo
21/26
原生大文件(cont)
写 读
删 Stat
• 数据分片:根据数据长度计算好分片个数 • 元分片:数据全部写成功之后生成 • 元分片:读到内存一个临时的buf中 • 数据分片:根据offset和size找到需要的分片 • 元分片:读到内存一个临时的buf中 • 数据分片:和元分片一块删除
• 操作解析
– 方法:GET/POST/PUT/DELETE/HEAD – 参数
• 举例
– curl --data-binary @file_to_up 10.232.35.41:3900/v1/tfscom
11/26
TFS交互模块
• 状态机 • 连接的读写事件
– ngx_http_tfs_read_handler – ngx_http_tfs_send_handler
JSON输出模块
排重
8/26
通用模块部分
• 配置文件指令解析
– 3个配置数据结构 • main_conf • srv_conf • loc_conf – 生命周期和nginx进程周期相同
• 设置Handler(请求入口)
– ngx_http_tfs_handler
• 初始化timer(用于rc-keep-alive)
• server
#server 配置块
– tfs_keepalive max_cached=100 bucket_count=10; #连接池大小 – tfs_tackle_log “pipe:/usr/sbin/cronolog -p 30min /home/mingyan.zc/ngx_bin/logs/cronolog/%Y/%m/%Y-%m-%d-%H-%Mtfs_access.log"; #配置tfs访问日志 – tfs_net_device bond0; #配置使用的网卡(获取本地地址用于rc登录)
• 使用json输出模块 • ls_dir要处理buf overflow
自动创建父 目录
• 无法使用递归 • 利用ngx_str_t结构的特性, 使用一个长度数组
25/26
排重
• 使用ngx_tair模块 • 动态创建tair实例
– 在main_conf中使用一个固定大小的数组,保存 • tair实例指针 • tair地址的哈希 – 每个逻辑集群有自己的tair实例 – 只初始化一次 – tair地址改变或进程退出时销毁tair实例
9/26
Handler
• 分配关键数据结构ngx_http_tfs_t
– 从请求的pool中分配的 – 生命周期和请求的生命周期相同 • RESTful解析 – 解析URI – 解析操作
• 对请求进行处理
– 特殊请求:写文件请求(带body)
10/26
RESTful解析
• URI解析
– 协议版本 • v1:原生TFS • v2:自定义文件名 – appkey – 关键词和文件名
CREATE_REQUEST INPUT_FILTER(可选) PROCESS_REQUEST_BODY FINALIZE_REQUEST(可选)
RETRY_HANDLER (可选)
typedef ngx_int_t (*tfs_peer_handler_pt)(ngx_http_tfs_t *t);
• 内存管理
– pool中分配,无需显式释放
• 发送/接收buf
12/26
状态机
读原生TFS文件 自定义文件名目录操作
START GET_META_TABLE
START GET_META_TABLE PROCESS DONE
GET_BLK_INFO
READ_DATA DONE
13/26
状态处理流程
– 指定content_type => "application/json“
28/26
Thank You!
29
写 读
• 重用大文件的过程 • 每写成功一批分片,保存元数据到meta server
• 重用大文件的过程(反复从ms读分片信息) • 空洞:将一个zero_buf反复挂到输出链

• 重用大文件的过程(反复从ms读分片信息) • 挨个删除分片,再删除ms上的元数据
24/26
自定义文件名——其他
ls_dir/ls_file
• location /
#根location配置块
#是否启用tfs模块
5
– tfs_pass enable=1;
编译运行
• 编译
– ./configure --add-module=/home/path/to/mod_tair/tair_2/ -add-module=/home/path/to/mod_tfs -prefix=/home/path/to/ngx_bin/ --with-debug
14/26
连接读写事件
• 写事件
– 连接tfs server( ngx_event_connect_peer ) – 发送tfs请求
• 读事件
– 接收tfs应答
15/26
内存管理
• 配置数据结构
– main_conf/srv_conf/loc_conf – 生命周期:nginx进程
• 从pool中分配
ngx_chain_t
buf next
ngx_http_tfs_peer_connection_t
tfs_peer peer body_buffer pool
17/26
连接池模块
• 维护到tfs的server之间的长连接 • 根据ip地址计算hash • 两个hash链表
– cache – free
• 使用readV2协议将元分片的头读出来
22/26
自定义文件名
• 重用原生文件的各个过程
– 区分:URI中的协议版本号(v2)
• 增加目录操作的过程 • Meta table
– 保存在配置文件的loc_conf结构中 – 更新:首次/root server更改/操作返回版本错误时
23/26
自定义文件名——文件
27/26
JSON输出模块
• 依赖yajl库 • ngx_http_tfs_json_init • ngx_http_tfs_json_xxx
– 对要返回的内容进行json封装 – 返回一个ngx_chain_t结构指针(会被链在ngx_http_tfs_t 的out_bufs的末尾)
• 返回json格式的应答
– 固定大小
• 数据结构
– 红黑树
• 内存分配/释放
– ngx_slab_alloc/ngx_lab_free_locked
• 我们需要实现
– 选择红黑树的key – 查找/插入/淘汰
20/26
原生大文件
• 重用小文件的各个过程
– 区分:大文件标记 • 参数显式指定(写) • 数据超过指定大小(15MB)(写) • 文件名(L)(读/删/stat)
• 所有的tair操作(PUT/GET/DELETE)也都是异步 的
26/26
rc keep-alive
• 利用nginx的定时事件
– module初始化时创建一个在worker process之间互斥的 变量 – worker process初始化时添加定时事件
• 在事件超时时模拟请求处理过程
– 遍历共享内存中的rc节点 – 记录当前keep-alive的节点在队列中的位置 – 处理完毕再添加一个定时事件
Nginx-tfs实现
2012.8.10 明俨
1
Agenda
• The Big Picture • 配置和使用 • 内部实现
2
The Big Picture
DownStream UpStream
CLIENT
• • • • • POST GET PUT DELETE HEAD
Nginx
• tengine • ngx_mod_tfs • ngx_mod_tair
TFS
• • • • • rc server name server data server root server meta server
3/26
配置和使用
4
配置文件
• http
– – – –
– – – –
#http 配置块
tfs_upstream 10.232.36.203:6100; #rc_server 地址 tfs_rc_zone size=128M; #rc所使用共享内存大小 tfs_block_cache_zone size=256M; #本地block cache所使用共享内存大小 tfs_poll_rcs lock_file=/home/xxx/nginx/logs/lk.file interval=10s timeout=3s enable=1; #rc keep-alive 使用的锁文件,时间间隔,超时时间,启用否 tfs_send_timeout 3s; #向tfs server发送数据超时时间 tfs_connect_timeout 3s; #连接tfs server超时时间 tfs_read_timeout 3s; #从tfs server读数据超时时间 tair_timeout 1s; #tair超时时间(连接/发送/接收数据)
相关文档
最新文档