[fastCGI/sqilite]七夜博客系统 FastCGI Blog 1.0 RC,七夜博客系统 FastCGI Blog 2.0。以及Nginx下的一次起多个fastcgi并Ok的代码,我估计七夜这个多个不行和其代码有关,后继续研究之多Fastcgi进程Ok后出现登录后不同进程去展示出现登录失败,进而发现其代码写得有问题,只走符合单进程,如多进程还得参考PHP的cookie实现机制。

jackxiang 2013-5-17 13:50 | |
七夜兄弟的fastcgi blog增强版:
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=200687
了解:
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3)  drupal文件上传

这个哥们的邮箱:sunjianfei@xiaomi.com
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
————————————————————————————————
找这个哥们他从邮箱里回了一个做好的,我没看明白当时为嘛选这些,问了下七夜:Add Time:2014-08-20
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3)  drupal文件上传
这玩意都是啥,像1) mysql都能直接直持吧?
像二mysql好像也有插件是吧?
像上传为嘛要用drupal来增强呢?
+————————+
有啥考量没?
七夜
14/8/20 星期三 上午 11:07:01
用nginx的上传就行   //是一个Nginx专用的上传模块,https://jackxiang.com/post/6221/ 有介绍。
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:01
七夜兄弟说的是那个nginx一个上传插件吧?nginx_upload_module

七夜
14/8/20 星期三 上午 11:09:00
恩是的。nginx模块
上午 11:09:23
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:23
我都想用c写一个专门的上传了,啊哈哈。
七夜
14/8/20 星期三 上午 11:09:43
不用。都有现成的

回忆未来-向东-Jàck 14/8/20 星期三 上午 11:10:17
写了一半写不下去了,c功力不够,对那个上传大文件是先放内存还是直接写文件这块涉及到缓存处理上好像有点纠结。
七夜
写磁盘。内存缓存部分
七夜
14/8/20 星期三 上午 11:13:11
写磁盘。内存缓存部分
————————
那是从内存一下写入磁盘,还是要有一个进程来看哪个文件内存放得多就先写呢?

啥也不会
14/8/20 星期三 上午 11:15:07
mmap啊 别的交给系统好了



SQLite的FTS3扩展

FTS3允许用户创建一个全文索引的特殊表,

CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);     /* FTS3 table */
CREATE TABLE enrondata2(content TEXT);                        /* Ordinary table */
使用FTS3效率特别快

SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux';  /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
http://www.cnblogs.com/abob/archive/2010/12/01/1893425.html

2)使用rmmseg进行中文分词:
C语言开源高性能中文分词组件,C语言mmseg中文分词器 《狮子的魂》:https://code.google.com/p/friso/

3) drupal文件上传:http://blog.sina.com.cn/s/blog_a94fd80d01017tkx.html

FastCGI Blog 2.0版本正在开发中,新的版本,将是代码级别的优化,还有一些功能的增强
1. 使用了内存池,提高申请小内存的效率.一个请求一个内存池.这样杜绝了内存泄漏。
2. 自己编写了hashmap、list等实现,减少对第三方lib的依赖
3. 使用配置文件,修改相关配置更加方便
4. 使用功能更为强大的html编辑器,增加后台文件上传功能
5. 代码高亮显示
6. 文章的全文搜索功能.(有时间的话,实现该功能)
http://bbs.chinaunix.net/thread-1790317-3-1.html
C FastCGI Blog 零痛苦一键安装包
自从上次发布了我用写C写的 FastCGI Blog,很多人都说安装不太方便,所以我做了个一键安装包,大家可以零痛苦体验
解开压缩包,执行
./install.sh "/root/local"
/root/local
是安装目录


Nginx转发 spawn-fcgi看护
欢迎测试,欢迎加入

七夜开发
的博客基础上进行升级:
1)升级为g++编译,方便整合c++库
2)升级使用sqlite3的fts3扩展,进行全文检索
3)使用rmmseg进行中文分词
目前正在更新:
1)  整理
代码
结构,提供方便的二次开发接口和说明文档
2)添加
文件
上传,实现drupal文件上传的
用户
体验
3)后台
模板
管理
代码还在完善中,请静侯
————————————————————————————————

所有的软件包下载List:
http://code.google.com/p/php-tokyocabinet/downloads/list

C实现的FastCGI Blog:
http://www.fengblog.org/archives/200/

http://blog.sina.com.cn/s/blog_7041f8eb0100nkxe.html
下载完整版的地址:
http://www.pudn.com/downloads426/sourcecode/windows/network/detail1804143.html

七夜博客系统 FastCGI Blog 2.0,自从C-blog1.0发布以来,很多人给了很中肯的意见。这段有时间了,赶紧的把一些大家都需要的功能给开发出来。现在推出c-blog2.0版本.在这个版本里,还没实现全文搜索.在2.1版里会实现全文搜索功能。
这次升级的功能列表:
1. 引入了 配置文件
2. 增加cookie 解析,和文件上传功能
3. html编辑器,换了 更为强大的KindEditor编辑器
4. 支持代码高亮
5. 使用了内存池.统一分配 统一释放,程序更安全
6. 更清晰的 程序目录分类.
(1) db 为 数据库目录
(2) log 为 日志目录
(3) src 为 c-blog源文件目录
(4) htdocs 为 www访问目录.nginx 指到这个目录就行
7. 使用 configure make make install 方式 安装.更为简单

一直想有个自己的blog,就是犯懒不肯code,最近对自己下了狠劲。利用一两个月业余时间完成了这个blog,我还是很有成就感的。哈哈哈。这个blog程序,这几天刚完成。有bug在所难免,欢迎大家提出来,我会不断的维护的。下面我罗列一下这个blog的功能

这个blog采用html template技术, 模板修改起来就跟php的模板一样简单

后台功能
1. 分类管理、添加、删除、编辑(只支持一级分类)
2. 文章管理、添加、删除、编辑
3. 生成静态首页、清除全部静态页缓存
4. 友情链接管理、添加、删除、编辑
5. 评论列表、删除
6. 简单的用户登录和退出
========================================================================================
这个blog 依赖这些 lib
1. FastCGI  http://www.fastcgi.com/dist/
2. tokyocabinet  http://fallabs.com/tokyocabinet/
DownLoad:http://fallabs.com/kyotocabinet/pkg/
http://fallabs.com/tokyocabinet/pastpkg/tokyocabinet-1.3.27.tar.gz

3. SQLite3 http://www.sqlite.org/download.html
4. jemalloc http://www.canonware.com/download/jemalloc/

下载上述软件,并编译安装.
blog的编译命令是(相关lib路径,根据自己的改,)
gcc -o blog blog.c util.c tpllib.c rbtree.c assign.c ./module/bl



(gdb) set env module=user
(gdb) run
Starting program: /usr/local/htdocs/cblog
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ff0b70 (LWP 5952)]
Location:/
输出:
./src/blog.c:                   puts("Location:/\r\n\r\n")


/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock


http://blogtest.com/article-read-opensource-15-c-fastcgi-blog-2.0.html
这个是用cgi生成的网页么?怎么访问这个cgi啊?

七夜  下午 02:47:19
article-read-opensource-15-c-fastcgi-blog-2.0.html
article 是访问article 模块
read  是访问article 模块 中的函数
opensource  是分类名
15 是 id
后面 的 都是 seo
url seo
回忆未来-向东-Jàck  下午 02:48:19
你这个有没有url的seo,这个得自己编写?
这个url的seo是不是写在nginx里的?当时。


等会
/panel-user-login.html

后台登录链接的Url及帐号名密码如下:
http://blogtest.com/panel-user-login.html
http://blogtest2.com/panel-user-login.html
用户名:七夜
密码:vilinux


tail -f   /data1/logs/access.log
tail -f /data1/logs/nginx_error.log
回忆未来-向东-Jàck  下午 03:09:22
192.168.137.1 - - [03/Jul/2013:15:09:11 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"

七夜  下午 03:09:40
看看error
errlor.log
回忆未来-向东-Jàck  下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"


回忆未来-向东-Jàck  下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
七夜  下午 03:11:10
chmod 777
没权限
回忆未来-向东-Jàck  下午 03:11:40
chmod -R 777 /tmp/fcgi-blog.sock  
是吧?

可以了,修改了下nginx的配置,如下可以,访问,不知密码是多少:
http://blogtest.com/panel-user-login.html


Ok的Nginx配置如下:


说明通过tail看nginx的日志多么重要:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log

The page you are looking for is temporarily unavailable.
Please try again later.
查看Nginx错误日志:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
==> /data1/logs/nginx_error.log <==
2013/07/03 18:17:50 [crit] 3728#0: *98 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"

==> /data1/logs/access.log <==
192.168.137.1 - - [03/Jul/2013:18:17:50 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"



ulimit -c unlimited
./cblog //产生core文件,core.5273
gdb cblog core.5273
----------------------------------
Core was generated by `./cblog'.
Program terminated with signal 11, Segmentation fault.
#0  0x00cab5e7 in tcmapput () from /usr/local/lib/libtokyocabinet.so.7
--------------------------------------------------------------------------------------------------
七夜  下午 05:21:33
不行,你不能这么gdb的
你 log 输出一下
就能知道了

====================================================================================
一)启动fastcgi:
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 2251
chmod -R 777 /tmp/fcgi-blog.sock

二)进去后出现:
./templets/panel/category_update.html Error loading template file!

三)调试方法:
root@192.168.137.128:/usr/local/conf# strace -p 2251
Process 2251 attached - interrupt to quit
accept(0, {sa_family=AF_FILE, NULL}, [2]) = 5
select(6, [5], NULL, NULL, {2, 0})      = 1 (in [5], left {1, 999996})
read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4\1\7\0\f\0QUERY_"..., 8192) = 1072
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77a0000
open("./templets/panel/category_insert.html", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xb77a0000, 4096)  


=====================================================================================
没法读到模板的问题如下解决办法:
-------------------------------------------------------
七夜兄弟:
open("./templets/blog/article_list.html", O_RDONLY) = -1 ENOENT (No such file or directory)

./module/panel/article.c:       if (tpl_load(tpl,"./templets/blog/article_list.html") != TPL_OK)

打开文件编译后,这个模板文件是相对于fastcgi这个程序是从哪儿开始算机的啊?
编译文件打开的模板文件你写的是相对路径,这个相对路径是相对的根目录是?

七夜  上午 11:13:12
/usr/local/htdocs/
你得在这个目录,你试试我的方法.
cd  /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -f ./cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 3639



这个sqllite备份怎么备份,
这玩意一个文件容易一出问题,整个文件里数据就挂了吧?
稳定性怎么样、如果真用sqlite的话。有没有办法提高其数据的安全这方面的经验。
七夜  上午 11:27:12
stop fastcgi. after copy sqlite3 db file to other path
安全,已经不在发布目录
所以不用担心会被浏览器下载什么的
七夜  上午 11:29:24
可能会有些小bug。大问题没有。我运行了一年
回忆未来-向东-Jàck  上午 11:30:13
像nginx下的php一样起多个。可以么?
七夜  上午 11:30:23
目前还不可以
回忆未来-向东-Jàck  上午 11:31:07
我看好像有个fastcgi命令可以起一个端口起来,有个参数是多少个进程的啊。
==========================================================
关于多个进程现在只有一个,可以再学习下。
下面关于后台的功能特别是那个缓存:
回忆未来-向东-Jàck  上午 11:32:26
这添加文章太快了,这种快感不错,比我在外面的博客快了进10倍,
这用户体验好啊。
清楚全部缓存
这个是什么意思,缓存在哪儿的?
七夜  上午 11:33:00
我会生成静态页的
列表页 首页 文章页
都会生成的静态页的
回忆未来-向东-Jàck  上午 11:33:20
生成首页
不就是么?
是自动生成的么,其他的静态页面。
首页要自己生成是吧?
七夜  上午 11:33:46
列表页 文章页 是自动生成的
访问生成的
回忆未来-向东-Jàck  上午 11:34:53
哈哈,好的,我有空再看下代码,学习一下,灰常感谢。


回忆未来-向东-Jàck  上午 11:36:34
tokyocabinet  jemalloc 用在这儿是干嘛的?
好像是内存分配的是吧?这个jemalloc。它有什么好处?
这个tokyocabinet  是个什么玩意?是缓存吗。
七夜  上午 11:38:43
jemalloc 优化的 内存管理器
tokyocabinet 有现成的 map list封装
回忆未来-向东-Jàck  上午 11:39:30
这样就不容易内存泄漏和数据结构上也带来了处理方便是吧?我也学学。
七夜  上午 11:41:45
不是,jemalloc 主要是代替 libc的malloc 和free
内存泄漏  还是自己去管理

回忆未来-向东-Jàck  上午 11:42:09
仅仅是设想下像这种单个的fastcg进程i能支持并发多少 有没有过测试或估计哩?
七夜  上午 11:42:16
你可以压测一下

问下scottjiang兄弟这块的实践经验:
fastcgi只起一个进程,大概能支持并发多少啊?scottjiang兄弟。
location ~ \.html$ {                        
    root           /usr/local/htdocs;        
    fastcgi_pass   unix:/tmp/fcgi-blog.sock;
    fastcgi_index  cblog;                    
    include        fastcgi_params;          
}
有没有经验值啊?我想了解下这块。再就是怎么把这一个进程变多个啊。
江庆海  上午 11:50:24
可以在apache中配置最大进程数。根据你的业务请求量,一般配几十吧。
你google一下配置说明,应该有可以启动进程数,每个进程数处理最大并发个数、超时等配置。
nginx 不太熟啊,应该也是有的。

================================================
多个进程的参考方法如下:
1. nginx安装(略过)
2. FastCGI安装
因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有另外一种方法安装nginx-fcgi来让nginx支持cgi,我们这里讲解一种使用spawn-fastcgi的方法。
#include <iostream>
#include <fcgi_stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0){
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译程序:g++ testcgi.c -o lzgFastCGI  -lfcgi
测试程序是否能正常运行:./myFastCGI,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/
3. nginx配置、测试
1) 拷贝lzgFastCGI程序到nginx下的cgibin目录(自己可以创建,根据需要更改)
2) 启动spawn-fastcgi管理进程
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
查看一下9002端口是否已成功:netstat -na | grep 9002
3) 更改nginx.conf配置文件

添加配置
location ~ \.cgi$ {
  fastcgi_pass 127.0.0.1:9002;
  fastcgi_index index.cgi;
  fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
  include fastcgi_params;
}

根据上面的文章进行实践是OK的:
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI

cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25  -f ./cblog

实践OK的,Ok步骤如下:
root@192.168.137.128:/usr/local/htdocs# /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25  -f ./cblog
spawn-fcgi: child spawned successfully: PID: 4367
root@192.168.137.128:/usr/local/htdocs# netstat -atlunp|grep 9002
tcp        0      0 127.0.0.1:9002              0.0.0.0:*                   LISTEN      4367/./cblog

Nginx配置:
location ~ \.cgi$ {     //这儿略有区别,是html都指向这个cgi了。

适当参考即可,和实际的情况均有出入:http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/

http://www.ha97.com/173.html
使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。

实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi          
spawn-fcgi: child spawned successfully: PID: 7551

ps aux|grep php
apache    7551 16.7  1.6  43396  6016 ?        Ssl  15:14   0:01 /usr/local/webserver/php/bin/php-cgi
====================================================================================

Sqlite表查询相关实践:
root@192.168.137.128:/usr/local/db# sqlite3 blog.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1)查看表名
sqlite> .table
article     category    comment     friendlink

2)查表内容:
sqlite> select * from category;
1|php|php|1
2|mysql|mysql|2
3|nosql|nosql|3
4|linux|linux|4
5|javascript|javascript|5
6||life|6
7||opensource|7
8|web2.0|web2.0|8

3)表结构:
sqlite> .schema category  
CREATE TABLE [category] (
[sid] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[sortname] VARCHAR(30)  NOT NULL,
[sortdir] VARCHAR(30)  NOT NULL,
[pos] INTEGER DEFAULT '0' NOT NULL
);
CREATE INDEX [IDX_CATEGORY_POS] ON [category](
[pos]  ASC
);

4)退出sqliite
sqlite> .exit







————————————————Add:2013-12-10启动了1000个fastcgi进程————————————————
http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
步骤如下:
(1)代码情况:heloFastCGI.c

(2)make情况:makefile.sh

(3)建立目录步骤:step.txt
mkdir -p /usr/local/webserver/nginx/myFastCGI                              
cp helloFastCGI /usr/local/webserver/nginx/myFastCGI                      
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f  
/usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000    
              
启动:
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f /usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000

启动后:
root@192.168.137.128:/data0/htdocs/myfastcgi# ps aux|grep helloFastCGI |wc
   1001   11012  115083
root@192.168.137.128:/data0/htdocs/myfastcgi# netstat -atlunp|grep 9100
tcp        0      0 127.0.0.1:9100              0.0.0.0:*                   LISTEN      5524/helloFastCGI  

注意这是一行命令哦。注意可能要sudo.
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了。显然这里的直接并发量是1000.
其他参数可以help看看:(看起来-C对不要php的我来说没啥用.本文是初次使用记录性教程,这里就不纠结这些参数了)
关闭spawn-fcgi打开的fastcgi程序:
$ netstat -anp | grep 9000 #查看占用9000端口的程序ID
$ kill -9 PID #或killall 进程名
后面这些进程启动后,怎么和nginx对接上呢,需要进行配置文件研究修改即可,文章里有说明。

                                              ...........关于配置的说明:..............
1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)

________________对cblog进行设置在原来基础上加上: -F 1000 ________________

root@192.168.137.128:/usr/local/htdocs# ps aux|grep cblog|wc
    491    5402   35846

==============================================================

对其扩展为多个FastCGI的进程后分别以Unix socket和9002进行较为深入的研究并证明其调度及和程序里cookie在多进程里出现登录失败的问题研究
=======================================================================================
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -f ./cblog -s /tmp/fcgi-blog.sock -F 3
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25  -f ./cblog
以下结论:其写的blog不支持多个进程的登录,上面起了进程均后只有3个进程,而其中走的是unix socket不是端口有两个:2392、2394。
其它一个是端口:9002,它个没有疑义。对于2392、2394两个进程是可能被fastcgi轮流来接请求的,于是出现cookie登录失败,实践知而只起一个这样的进程ID号,不会存在这样的情况,估计其cookie没有写得兼容多个fastcgi罢。
同时发现只起动/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -f ./cblog -s /tmp/fcgi-blog.sock -F 3,出现其进程有时只有2个,说明程序相当不稳定,所以只能说是起研究之用:
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh  
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2638
spawn-fcgi: child spawned successfully: PID: 2639
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2655
spawn-fcgi: child spawned successfully: PID: 2656
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2671
spawn-fcgi: child spawned successfully: PID: 2673
spawn-fcgi: child spawned successfully: PID: 2674
只启动上面这一个本地unix socket后出现,如果连接:http://blogtest2.com/panel-user-login.html 也就是9002出现:
The page you are looking for is temporarily unavailable.
Please try again later.
说明这两者:Unix socket和9002是独立的。
(第二:再次证明之反证。)反之,如只起用9002多个pid后,是什么情况?实践一下:
起3个依旧不稳定: /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25  -f ./cblog -F 3
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh    
spawn-fcgi: child signaled: 8
spawn-fcgi: child spawned successfully: PID: 2736
spawn-fcgi: child spawned successfully: PID: 2737
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2752
spawn-fcgi: child spawned successfully: PID: 2753
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2763
spawn-fcgi: child spawned successfully: PID: 2765
spawn-fcgi: child spawned successfully: PID: 2766
此时访问 Unix socket出现得到确实是独立的再次证晨:
http://blogtest.com/panel-user-login.html  The page you are looking for is temporarily unavailable.Please try again later.
root@192.168.137.128:/usr/local/webserver/nginx# strace -p 2763 -p 2765
http://blogtest2.com/panel-user-login.html
Process 2763 attached - interrupt to quit
Process 2765 attached - interrupt to quit
[pid  2765] accept(0,  <unfinished ...>
[pid  2763] accept(0, {sa_family=AF_INET, sin_port=htons(56906), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid  2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid  2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\277\1\0\17\32SCRIPT"..., 8192) = 1000
[pid  2763] time(NULL)                  = 1386912681
[pid  2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid  2763] munmap(0xb778e000, 4096)    = 0
[pid  2763] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid  2763] shutdown(5, 1 /* send */)   = 0
[pid  2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999995})
[pid  2763] read(5, "", 1024)           = 0
[pid  2763] close(5)                    = 0
[pid  2763] accept(0,
登录action:
[pid  2765] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56908), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid  2765] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid  2765] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4f\2\0\17\32SCRIPT"..., 8192) = 1240
[pid  2765] time(NULL)                  = 1386912715
[pid  2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7758000
[pid  2765] gettimeofday({1386912715, 783922}, NULL) = 0
[pid  2765] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid  2765] fcntl64(6, F_GETFD)         = 0
[pid  2765] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid  2765] getuid32()                  = 0
[pid  2765] getppid()                   = 1
[pid  2765] gettimeofday({1386912715, 801719}, NULL) = 0
[pid  2765] gettimeofday({1386912715, 802502}, NULL) = 0
[pid  2765] read(6, "\304\264\345M\0?\352V\4\320\323\257u$\16\325", 16) = 16
[pid  2765] gettid()                    = 2765
[pid  2765] time(NULL)                  = 1386912715
[pid  2765] open("/etc/localtime", O_RDONLY) = 7
[pid  2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7757000
[pid  2765] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid  2765] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid  2765] read(7, "\nCST-8\n", 4096)  = 7
[pid  2765] close(7)                    = 0
[pid  2765] munmap(0xb7757000, 4096)    = 0
[pid  2765] munmap(0xb7758000, 4096)    = 0
[pid  2765] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=05ef"..., 224) = 224
[pid  2765] shutdown(5, 1 /* send */)   = 0
[pid  2765] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999994})
[pid  2765] read(5, "", 1024)           = 0
[pid  2765] close(5)                    = 0
[pid  2765] accept(0,
跳转到管理页面又变回2763:
[pid  2763] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56909), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid  2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid  2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\374\4\0\17\36SCRIPT"..., 8192) = 1064
[pid  2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid  2763] munmap(0xb778e000, 4096)    = 0
[pid  2763] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid  2763] shutdown(5, 1 /* send */)   = 0
[pid  2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999150})
[pid  2763] read(5, "", 1024)           = 0
[pid  2763] close(5)                    = 0
[pid  2763] accept(0,
说明这个第一个Unix的socket也好,9002端口也好,都存在我们常说的一个问题就是都会通过fastcgi协议分派到不同的进程中去处理,是有统一调度的!!!
第二:两者是独立的,一个是访问句柄,一个是访问端口进行通讯,独立而不干扰。但是这块七夜写的Cookie的登录判断这块可能写得不够严谨,有时间得看下这块的代码实现才行,同时借鉴PHP的cookie实现机制才能实现真正的cookie在多进程下不会出现失效的问题。EOF
——————第一:混合的情况:Unix Socket和9002同时————
作登录请求
root@192.168.137.128:~# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2386
spawn-fcgi: child spawned successfully: PID: 2392
spawn-fcgi: child spawned successfully: PID: 2394
spawn-fcgi: child spawned successfully: PID: 2395
root@192.168.137.128:~# ps aux|grep cblog      
root      2386  0.0  0.2  13868  1112 ?        Ssl  13:15   0:00 ./cblog
root      2392  0.0  0.2  13868  1112 ?        Ssl  13:15   0:00 ./cblog
root      2394  0.0  0.2  13868  1112 ?        Ssl  13:15   0:00 ./cblog
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
从:http://blogtest2.com/panel-user-login.html
到登录:登陆成功!的action都是:2386进程在干(见:)。
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
Process 2386 attached - interrupt to quit
Process 2392 attached - interrupt to quit
Process 2394 attached - interrupt to quit
[pid  2394] accept(0,  <unfinished ...>
[pid  2392] accept(0,  <unfinished ...>
[pid  2386] accept(0, {sa_family=AF_INET, sin_port=htons(56887), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid  2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid  2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\221\7\0\17\32SCRIPT"..., 8192) = 960
[pid  2386] time(NULL)                  = 1386911788
[pid  2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid  2386] munmap(0xb77d3000, 4096)    = 0
[pid  2386] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid  2386] shutdown(5, 1 /* send */)   = 0
[pid  2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999727})
[pid  2386] read(5, "", 1024)           = 0
[pid  2386] close(5)                    = 0
[pid  2386] accept(0, {sa_family=AF_INET, sin_port=htons(56889), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid  2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid  2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\0048\0\0\17\32SCRIPT"..., 8192) = 1192
[pid  2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid  2386] gettimeofday({1386911862, 145842}, NULL) = 0
[pid  2386] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid  2386] fcntl64(6, F_GETFD)         = 0
[pid  2386] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid  2386] getuid32()                  = 0
[pid  2386] getppid()                   = 1
[pid  2386] gettimeofday({1386911862, 155096}, NULL) = 0
[pid  2386] gettimeofday({1386911862, 155738}, NULL) = 0
[pid  2386] read(6, "\3218\03774\374\342\3\f\330\377M{\214y\24", 16) = 16
[pid  2386] gettid()                    = 2386
[pid  2386] time(NULL)                  = 1386911862
[pid  2386] open("/etc/localtime", O_RDONLY) = 7
[pid  2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d2000
[pid  2386] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid  2386] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid  2386] read(7, "\nCST-8\n", 4096)  = 7
[pid  2386] close(7)                    = 0
[pid  2386] munmap(0xb77d2000, 4096)    = 0
[pid  2386] munmap(0xb77d3000, 4096)    = 0
[pid  2386] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=44ad"..., 224) = 224
[pid  2386] shutdown(5, 1 /* send */)   = 0
[pid  2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 982622})
[pid  2386] read(5, "", 1024)           = 0
[pid  2386] close(5)                    = 0
[pid  2386] accept(0,
登录后进入管理:还是2386



方式:fastcgi_pass 127.0.0.1:9002;
http://blogtest.com/panel-user-login.html
[pid  2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid  2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid  2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\211\7\0\f\0QUERY_"..., 8192) = 952
[pid  2392] time(NULL)                  = 1386912018
[pid  2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid  2392] munmap(0xb7796000, 4096)    = 0
[pid  2392] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid  2392] shutdown(5, 1 /* send */)   = 0
[pid  2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid  2392] read(5, "", 1024)           = 0
[pid  2392] close(5)                    = 0
[pid  2392] accept(0,
提交action:
[pid  2394] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid  2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999991})
[pid  2394] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4/\1\0\f\0QUERY_"..., 8192) = 1184
[pid  2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77dc000
[pid  2394] gettimeofday({1386912056, 976899}, NULL) = 0
[pid  2394] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid  2394] fcntl64(6, F_GETFD)         = 0
[pid  2394] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid  2394] getuid32()                  = 0
[pid  2394] getppid()                   = 1
[pid  2394] gettimeofday({1386912056, 978495}, NULL) = 0
[pid  2394] gettimeofday({1386912056, 978630}, NULL) = 0
[pid  2394] read(6, "\366\377\210C\247\350\367\231\221a7\271sE}\251", 16) = 16
[pid  2394] gettid()                    = 2394
[pid  2394] time(NULL)                  = 1386912056
[pid  2394] open("/etc/localtime", O_RDONLY) = 7
[pid  2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid  2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77db000
[pid  2394] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid  2394] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid  2394] read(7, "\nCST-8\n", 4096)  = 7
[pid  2394] close(7)                    = 0
[pid  2394] munmap(0xb77db000, 4096)    = 0
[pid  2394] munmap(0xb77dc000, 4096)    = 0
[pid  2394] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=c605"..., 224) = 224
[pid  2394] shutdown(5, 1 /* send */)   = 0
[pid  2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999992})
[pid  2394] read(5, "", 1024)           = 0
[pid  2394] close(5)                    = 0
[pid  2394] accept(0,
http://blogtest.com/cpanel.htm  [未登录]
[pid  2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid  2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999989})
[pid  2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\357\1\0\f\0QUERY_"..., 8192) = 1048
[pid  2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid  2392] munmap(0xb7796000, 4096)    = 0
[pid  2392] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid  2392] shutdown(5, 1 /* send */)   = 0
[pid  2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999993})
[pid  2392] read(5, "", 1024)           = 0
[pid  2392] close(5)                    = 0
[pid  2392] accept(0,  
方式:fastcgi_pass   unix:/tmp/fcgi-blog.sock;

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6365/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2014-8-20 11:14
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]