- 浏览: 220374 次
- 性别:
- 来自: 上海
-
最新评论
-
DILIGENT203:
最后绿色的一段话没有看明白,还是不明白nginx为什么要广播c ...
Nginx事件处理(epoll) -
烟雨遥_sun:
可否考虑用长连接?表示正在用这个多线程连接对数据库的,遇到了内 ...
MySQL C API的内存泄露问题 -
gsnumen:
...
Nginx的upstream模块和反向代理(一) -
zivon:
...
Nginx的upstream模块和反向代理(一)
文章列表
查看编译器的默认include路径
- 博客分类:
- C语言编程
在shell下运行:
$ echo | gcc -v -x c++ -E -
或者
$ echo | g++ -v -x c++ -E -
可以看到类似如下的结果
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release ...
Internet地址结构及转换
- 博客分类:
- C语言编程
Internet地址的基本数据结构如下:
#include <netinet/in.h>
struct sockaddr_in {
short sin_family; // e.g. AF_INET
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this ...
首先,必须安装几个开发包,在centos/fedora下,可以使用yum安装:
$ yum -y install tcl-devel expect-devel
装完以后,就可以使用expect来写代码了,从网上拉下来一段代码,稍微修改了一下:
#include <tcl.h>
#include <expect.h>
#include ...
1. 安装gcc的objc编译功能:
$ yum -y install gcc-objc
2. 从http://wwwmain.gnustep.org下载GNUstep Startup和GNUstep Base,并从源码进行安装。
3. 把gnustep tools目录加入到系统目录下(默认是/usr/GNUstep/System/Tools)
$ export PATH=$PATH:/usr/GNUstep/System/Tools
4. 把编译好的库放在ldconfig的配置文件
$ echo "/usr/GNUstep/Local/Librar ...
diff和patch给源码做补丁
- 博客分类:
- C语言编程
如果想要对两个目录下的所有文件做diff,可以使用以下命令:
$ diff -BurN [org-src-dir] [target-src-dir] > [patch-file]
其中-B可以忽略所有的空白行,-r对所有的子目录进行递归的操作。[org-src-dir]是未经修改前的源文件目录,[target-src-dir]是修改后的源文件目录。注意:最后生成的patch文件是用来作用到[org-src-dir]的内容。
使用patch来对[org-src-dir]打补丁,对其进行内容变更:
$ patch -p[N] < [patc ...
由于工作中时常遇到web server/cache的开发工作。一旦做出一些改动,或者添加一些功能,除了功能测试(比如设计一些测试用例)、查看debug信息之外,还需要对整个系统做全面的测试。反向代理服务器和缓存,往往承载着大量的并发请求,对于稳定性的要求很高。这就需要一款比较好的benchmark来进行测试。
Web Polygraph是几年前专门为缓存服务器、代理服务器等设计的测试工具。它具有比较完整的测试用例(比如专门为正向代理和反向代理的测试用例)。另外,它还有一套专门的description language (PGL),可以让测试者来定制测试用例。它的测试结果的呈现也是比较强大 ...
Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close"。Nginx与前端的连接默认为长连接,一个用户跟Nginx建立连接之后,通过这个长连接发送多个请求。如果Nginx只是作为rever ...
上一篇把upstream的配置和初始化的代码稍微分析了一下。本篇主要用图来解释一下upstream反向代理在收到用户请求之后初始化和事件处理流程。
当Nginx收到downstream(用户或者是其他代理)的请求的时候,它会初始化upstream的请求(如图)。经过了下图所示的步骤之后,Nginx创建了向upstream服务器的请求,并向upstream服务器发起连接请求。
下面,通过事件触发/处理机制,Nginx通过建立的连接向upstream发送请求,并检查client(downstream)连接是否断开。当从upstream服务器收到回复的时候,会触发事件,并向d ...
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。
Pthreads提供了多种锁机制:(1) Mutex(互斥量):pthread_mutex_***(2) Spin lock(自旋锁):pthread_spin_***(3) Condition Variable(条件变量):pthre ...
本文从几个部分来详细介绍Nginx的proxy cache功能。第一部分,主要介绍proxy cache的过期、空间管理等。第二部分,主要介绍在Nginx(作为反向代理服务器)收到请求之后,如何检查本地的缓存来确定是否要向后端服务器发起请求。第三 ...
Nginx的内存缓存是通过slab pool来实现的,但是目前Nginx代码没有对http响应进行内存缓存。比如作为反向代理服务器时向后端获取的文件也只是缓存在磁盘里,而内存只是用来做索引。不过Nginx已经提供了内存缓存功能的函数,所以如果在其他地方有需要使用内存缓存的话,也可以通过修改代码来实现(当然,也可以用memory disk来实现内存缓存)。在Nginx的内存缓存机制中,最重要的结构就是ngx_slab_pool_t,里面存放了包括内存缓存的空间使用情况、位置映射以及缓存空间本身的几乎所有信息。先来看一下ngx_slab_pool_t吧。
typedef struct {
ng ...
在nginx里面,定义了一个spinlock,来同步父子进程间的共享内存操作
#define ngx_shmtx_lock(mtx) ngx_spinlock((mtx)->lock, ngx_pid, 1024)
void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
{
#if (NGX_HAVE_ATOMIC_OPS)
ngx_uint_t i, n;
for ( ;; ) {
//__sync_bool_compare_and_swa ...
mmap函数是unix/linux下的系统调用,来看《Unix Netword programming》卷二12.2节对mmap的介绍:
The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes:1. with a regular file to provide memory-mapped I/O2. with special files to provide an ...
static void mainInitialize(void)
{
//...
//do nothing ...
comm_select_postinit();
//configure_once代表是否曾经调用过mainInitialize()函数
//1表示之前调用过
if (!configured_once)
//do nothing ...
disk_init(); /* disk_init must go before ipcache_init() */
//域名和IP地址的缓存初始化,用来缓存dns正反解得到的ip
...
启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,和调用exec函数的进程一样。
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char ...