﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-concentrate on c/c++ related technology-随笔分类-nginx</title><link>http://www.cppblog.com/jolleydtan/category/21189.html</link><description>plan,refactor,daily-build, self-discipline,</description><language>zh-cn</language><lastBuildDate>Sat, 21 May 2016 05:27:31 GMT</lastBuildDate><pubDate>Sat, 21 May 2016 05:27:31 GMT</pubDate><ttl>60</ttl><item><title>nginx开发第一个helloworld.</title><link>http://www.cppblog.com/jolleydtan/archive/2016/05/10/213147.html</link><dc:creator>jolley</dc:creator><author>jolley</author><pubDate>Tue, 10 May 2016 00:25:00 GMT</pubDate><guid>http://www.cppblog.com/jolleydtan/archive/2016/05/10/213147.html</guid><wfw:comment>http://www.cppblog.com/jolleydtan/comments/213147.html</wfw:comment><comments>http://www.cppblog.com/jolleydtan/archive/2016/05/10/213147.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jolleydtan/comments/commentRss/213147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jolleydtan/services/trackbacks/213147.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><span style="font-size: 15pt">Nginx</span><span style="font-family: 宋体; font-size: 15pt">开发第三方模块实例</span><span style="font-size: 15pt"></span></p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings; font-size: 15pt">&#216;&nbsp;</span><span style="font-family: 宋体; font-size: 15pt">序言</span></p>
<p>Nginx<span style="font-family: 宋体">是一个极具扩展性的服务器</span>,<span style="font-family: 宋体">这显著体现在对第三方模块的支持，开发者能够将自己开发的模块，按照</span>nginx<span style="font-family: 宋体">既有的规则，完美地融合进</span>http<span style="font-family: 宋体">框架中，以实现开发者定制功能的作用。</span></p>
<p><span style="font-family: 宋体">这篇文章主要用于结合如何开发一个简单的第三方模块，目标人群为想了解</span>nginx<span style="font-family: 宋体">开发第三方模块的同学，文章内容主要包括三个部分，如何将</span>HTTP<span style="font-family: 宋体">模块嵌入</span>nginx<span style="font-family: 宋体">和如何开发第三方模块以及一个例子。</span></p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings; font-size: 15pt">&#216;&nbsp;</span><span style="font-family: 宋体; font-size: 15pt">如何将</span><span style="font-size: 15pt">HTTP</span><span style="font-family: 宋体; font-size: 15pt">模块嵌入</span><span style="font-size: 15pt">nginx</span></p>
<p style="margin-left: 21pt">Nginx<span style="font-family: 宋体">目前来说提供了二种方式</span>,config<span style="font-family: 宋体">文件</span>+configure <span style="font-family: 宋体">脚本，手动方式，后面手动方式是更加复杂的，且容易出错，在常规的</span>nginx<span style="font-family: 宋体">开发中，基本上都是用</span>config<span style="font-family: 宋体">文件</span>+configure<span style="font-family: 宋体">脚本方式比较多。接下来分别介绍这两种方式。</span></p>
<p style="margin-left: 21pt">&nbsp;</p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-size: 15pt">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">Config</span><span style="font-family: 宋体; font-size: 15pt">文件</span><span style="font-size: 15pt">+configure</span><span style="font-family: 宋体; font-size: 15pt">脚本</span></p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings">l&nbsp;</span>Config<span style="font-family: 宋体">文件</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">这个是指提供</span>config<span style="font-family: 宋体">文件，并且在文件里面给出三个配置项，就可以达到效果。这三个配置项是指：</span></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span style="font-size: 15pt">A.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">Ngx_addon_name</span><span style="font-family: 宋体; font-size: 15pt">：</span><span style="font-family: 宋体">就是自己要开发的这个模块名字。</span></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span>B.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">Nginx</span><span style="font-family: 宋体; font-size: 15pt">模块名：</span><span style="font-family: 宋体">这有点像设置环境变量啥的，首先要知道自己开发啥模块，</span>nginx<span style="font-family: 宋体">对应的模块有，</span>$HTTP_MODULES(<span style="font-family: 宋体">常规的</span>http<span style="font-family: 宋体">模块</span>), $HTTP_FILTER_MODULES(HTTP<span style="font-family: 宋体">过滤模块</span>)<span style="font-family: 宋体">，</span>$HTTP_HEAD_FILTER_MODULES(HTTP <span style="font-family: 宋体">头部过滤模块</span>)<span style="font-family: 宋体">，</span> $CORE_MODULES(nginx<span style="font-family: 宋体">的核心模块</span>)<span style="font-family: 宋体">，</span>$EVENT_MODULES(nginx<span style="font-family: 宋体">的事件模块</span>)<span style="font-family: 宋体">等，然后在后面添加你所要添加的模块名字，以空格隔开，比如这次我们开发添加的模块</span>:</p>
<p style="margin-left: 21pt">HTTP_MODULES = &#8220;$HTTP_MODULES ngx_http_helloworld_module&#8221;</p>
<p style="text-indent: -21pt; margin-left: 42pt"><span>C.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">NGX_ADDON_SRCS</span><span style="font-family: 宋体; font-size: 15pt">：</span><span style="font-family: 宋体">这个顾名思义，就是指定新添加文件的路径，不过这个都是相对路径，因为在</span>configure<span style="font-family: 宋体">的时候就指定了上层路径，比如</span>--add-modules=PATH<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">比如我们这次开发要添加的源文件：</span></p>
<p style="margin-left: 42pt">NGX_ADDON_SRCS = &#8220;$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_helloworld_module.c&#8221;</p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings; font-size: 15pt">l&nbsp;</span><span style="font-size: 15pt">Configure</span><span style="font-family: 宋体; font-size: 15pt">脚本</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">这里需要用</span>- -add-module=PATH<span style="font-family: 宋体">将第三方模块的路径加入，</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">比如</span>configure - -add-module=~/ngx_3<sup><span style="font-family: 宋体">rd</span></sup>_modules/</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">那我们能分析下这背后做了什么呢？我们从下面两个部分来展开说明</span></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span style="font-size: 15pt">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">Auto/modules</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">这个主要是说明将定制的第三方模块添加到生成的</span>ngx_modules.c<span style="font-family: 宋体">里面。</span></p>
<p style="text-indent: -21pt; margin-left: 63pt"><span>a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">指定模块下面的配置文件</span>.<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1aa.png" /><br /></p>
<p style="text-align: left; margin-left: 63pt" align="left"></p>
<p style="text-indent: -21pt; margin-left: 63pt"><span>b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">生成模块信息</span></p>
<p style="text-indent: -21pt; margin-left: 84pt"><span>一、</span><span style="font-family: 宋体">生成模块数组</span></p>
<p style="margin-left: 84pt"><span style="font-family: 宋体">根据需要开启的模块加载对应的模块</span>,<span style="font-family: 宋体">下面是开启</span>http<span style="font-family: 宋体">模块后的所需要的模块<br /></span>&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1ab.png" /></p>
<p style="text-indent: -21pt; margin-left: 84pt"><span>二、</span><span style="font-family: 宋体">生成</span>ngx_modules.c<span style="font-family: 宋体">文件</span></p>
<p style="text-align: left; margin-left: 84pt" align="left"></p>
<p style="margin-left: 84pt">&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1b2.png" /></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span style="font-size: 15pt">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 15pt">Auto/make</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">显而易见，这个就是负责编译相关的模块。</span></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span>1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">生成第三方源码<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1b1.png" /><br /></span></p>
<p style="margin-left: 42pt"></p>
<p style="text-indent: -21pt; margin-left: 42pt"><span>2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">生成链接代码，并将目标文件，库文件链接成二进制程序<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1b21.png" /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/jolleydtan/1b22.png" /><br /></span></p>
<p style="text-align: left; margin-left: 42pt" align="left"></p>
<p style="margin-left: 21pt"></p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-size: 15pt">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; font-size: 15pt">手动方式</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">分两步来做，第一，修改</span>obj/ngx_modules.c, <span style="font-family: 宋体">在里面增加对应的第三方模块，第二，修改</span>obj/Makefile,<span style="font-family: 宋体">在里面增加第三方模块的编译，这种直接修改的方法不太可取，易出错，一般都是用上面的第二种方法。</span></p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings; font-size: 15pt">&#216;&nbsp;</span><span style="font-family: 宋体; font-size: 15pt">开发第三方模块注意事项</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">首先,要确定针对那个模块进行开发，</span>nginx<span style="font-family: 宋体">的模块是有顺序性的，比如：</span> <span>HTTP_MODULES = &#8220;$HTTP_MODULES ngx_http_helloworld_module&#8221;</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">其次，因为</span>nginx<span style="font-family: 宋体">是异步非阻塞的，在编制代码时，一定要注意不能阻塞</span>nginx<span style="font-family: 宋体">进程</span>.</p>
<p style="text-indent: -21pt; margin-left: 21pt"><span style="font-family: Wingdings; font-size: 15pt">&#216;&nbsp;</span><span style="font-family: 宋体; font-size: 15pt">示例</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体; font-size: 15pt">见附件<a href="/Files/jolleydtan/test.zip">/Files/jolleydtan/test.zip</a></span></p>
<p>&nbsp;</p>
<p>&nbsp;参考：<br /></p>
<p>深入理解nginx.&nbsp;</p><img src ="http://www.cppblog.com/jolleydtan/aggbug/213147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jolleydtan/" target="_blank">jolley</a> 2016-05-10 08:25 <a href="http://www.cppblog.com/jolleydtan/archive/2016/05/10/213147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nginx tcp负载均衡</title><link>http://www.cppblog.com/jolleydtan/archive/2016/03/11/212962.html</link><dc:creator>jolley</dc:creator><author>jolley</author><pubDate>Fri, 11 Mar 2016 00:44:00 GMT</pubDate><guid>http://www.cppblog.com/jolleydtan/archive/2016/03/11/212962.html</guid><wfw:comment>http://www.cppblog.com/jolleydtan/comments/212962.html</wfw:comment><comments>http://www.cppblog.com/jolleydtan/archive/2016/03/11/212962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jolleydtan/comments/commentRss/212962.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jolleydtan/services/trackbacks/212962.html</trackback:ping><description><![CDATA[<div>现在nginx的版本已经到了1.9.12，不过在1.9.0的时候，就开始了对TCP代理服务器的支持。<br />之前也有一些早期的做法，比如就有写了nginx_tcp_module模块的<a style="text-transform: none; text-indent: 0px; letter-spacing: normal; font: 15px/24px Helvetica, 'Hiragino Sans GB', 微软雅黑, 'Microsoft YaHei UI', SimSun, SimHei, arial, sans-serif; white-space: normal; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" href="https://github.com/yaoweibin/nginx_tcp_proxy_module">https://github.com/yaoweibin/nginx_tcp_proxy_module</a>,<br />以及nginx_stream_lua模块的<br /><a style="text-transform: none; text-indent: 0px; letter-spacing: normal; font: 15px/24px Helvetica, 'Hiragino Sans GB', 微软雅黑, 'Microsoft YaHei UI', SimSun, SimHei, arial, sans-serif; white-space: normal; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" href="https://github.com/openresty/stream-lua-nginx-module">https://github.com/openresty/stream-lua-nginx-module</a><br />本来就想着用这两个的，后来发现已经有支持了，就先来试试看看这个了。<br />默认的话，nginx是没有开启对tcp的支持的.如果要支持的话，需要用--with-stream去指定。<br />我这边只要需要三个IP，一个是nginx进程所在的机器，我这边用192.168.1.4表示，<br />另外两台就是TCP上游业务服务器，我们分别用192.168.1.5和192.168.1.21来表示，<br />基于这样的考虑是因为nginx充当tcp代理服务器后，自身也会占用一个端口。<br />并且从目前来说，貌似一个nginx进程也就只能listen一个端口。<br />我用的版本是nginx 1.9.9.<br />我在/usr/local/nginx/conf下面新建了nginx_stream_tcp.conf作为本次的测试。<br /><font color="#000000" face="Verdana">worker_processes auto;<br />&nbsp; 2 error_log /usr/local/nginx/logs/error.log info;<br />&nbsp; 3 events {<br />&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp; worker_connections&nbsp; 1024;<br />&nbsp; 5 }<br />&nbsp; 6 <br />&nbsp; 7 stream {<br />&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp; upstream loadbalance {<br />&nbsp; 9 # Specifies a load balancing method for a server group where client-server mapping is based on the hashed key value<br />&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash $remote_addr consistent;<br />&nbsp;11 # sets the weight of the server, by default, 1.<br />&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server 192.168.1.21:8001 weight=5;<br />&nbsp;13 # by default, the parameter is set to 10 seconds.<br />&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server 192.168.1.5:9001&nbsp; max_fails=3 fail_timeout=30s;<br />&nbsp;15 <br />&nbsp;16&nbsp;<br />&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;18 <br />&nbsp;19 server {<br />&nbsp;20 # listen 8001.<br />&nbsp;21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen 8001;<br />&nbsp;22 # Defines a timeout for establishing a connection with a proxied server.<br />&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_connect_timeout 1s;<br />&nbsp;24 # Sets the timeout between two successive read or write operations on client or proxied server connections<br />&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_timeout 3s;<br />&nbsp;26 # Sets the address of a proxied server<br />&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass loadbalance;<br />&nbsp;28&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;29 <br />&nbsp;30 }<br /></font>这个大部分是官网支持的，所以其实我也没有修改太多，就设置了几个IP和端口。<br />在编译好nginx后，可以用/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx_stream_tcp.conf<br />就可以起来了，可以通过netstat -tlnp查看是否起来，大致显示这样的：<br /><font color="#000000" face="Verdana">tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:8001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7744/nginx_stream_t<br /></font>当然也可以通过telnet来查看。<br />接下来，写个简单的cs程序来验证下吧.<br />
<p><font color="#000000" face="Verdana">server端：<br />if __name__ == '__main__':<br />&nbsp;import socket<br />&nbsp;import commands<br />&nbsp;sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />&nbsp;sock.bind(('192.168.1.21', 8001))<br />&nbsp;sock.listen(5)<br />&nbsp;while True:<br />&nbsp;&nbsp;connection,address = sock.accept()<br />&nbsp;&nbsp;print "connected by",address<br />&nbsp;&nbsp;while 1:</font></p>
<p><font color="#000000" face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;buf = connection.recv(1024)<br />&nbsp;&nbsp;&nbsp;&nbsp;if buf != "" :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "connection buffer", buf<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.sendall(buf)<br />&nbsp;connection.close()</font></p>client端：<br /><font color="#000000" face="Verdana">if __name__ == '__main__':&nbsp; <br />&nbsp;&nbsp;&nbsp; import socket<br />&nbsp;&nbsp;&nbsp; HOST='192.168.1.4'<br />&nbsp;&nbsp;&nbsp; PORT=8001<br />&nbsp;&nbsp;&nbsp; sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&nbsp; <br />&nbsp;&nbsp;&nbsp; sock.connect((HOST, PORT))<br />&nbsp;&nbsp;&nbsp; while 1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd = raw_input("please input cmd:")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sock.sendall(cmd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = sock.recv(1024)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print data<br />&nbsp;&nbsp;&nbsp; sock.close()<br /><br />在client向192.168.1.4发起一个TCP连接时，接下来192.168.1.4会连接到192.168.1.21，<br /><!--StartFragment -->

<div> </div>192.168.1.21的server端会显示， connected by ('192.168.1.4',58559)<br />后面的端口应该是随机的临时端口。<br />其实它的确起到了转发作用，这个nginx进程相当于一个通用网关，如果有两个client向nginx进程发起连接，一旦nginx那边调度到同一个上游TCP服务器，那么只需要从NGINX进程建立一个TCP连接到上游TCP服务器即可。<br /></font>之前我自己设计网关的时候，不是依赖于用户的，而是通过静态配置来建立连接的，比如上游逻辑服务器跟网关有连接，那都是在启动服务器的时候，就建立起来了。<br />这样有个好处就是可以省事，不过也可以采用这种方式，有玩家连接进某个上游TCP服务器才让网关跟这个TCP服务器建立连接，否则无需处理。因为不少时候还是会有不少服务器处于空闲的.<br /><br /></div> <img src ="http://www.cppblog.com/jolleydtan/aggbug/212962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jolleydtan/" target="_blank">jolley</a> 2016-03-11 08:44 <a href="http://www.cppblog.com/jolleydtan/archive/2016/03/11/212962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>