nginx随笔

lobo · 2018-10-31 15:47:40 · 1125 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-10-31 15:47:40 的文章,其中的信息可能已经有所发展或是发生改变。

一、nginx配合memcache缓存资源

image.png

配置实例:

upstream memcacheds {

    server 10.1.240.166:22222;

}

server {

    listen       8080;
    server_name  nm.ttlsa.com;
    index index.html index.htm index.php;
    root  /data/wwwroot/test.ttlsa.com/webroot;

    location /images/ {
            set $memcached_key $request_uri;
            add_header X-mem-key  $memcached_key;
            memcached_pass  memcacheds;
            default_type text/html;
            error_page 404 502 504 = @app;
    }

    location @app {
            rewrite ^/.* /nm_ttlsa.php?key=$request_uri;
    }

    location ~ .*\.php?$
    {
            include fastcgi_params;
            fastcgi_pass  127.0.0.1:10081;
            fastcgi_index index.php;
            fastcgi_connect_timeout 60;
            fastcgi_send_timeout 180;
            fastcgi_read_timeout 180;
            fastcgi_buffer_size 128k;
            fastcgi_buffers 4 256k;
            fastcgi_busy_buffers_size 256k;
            fastcgi_temp_file_write_size 256k;
            fastcgi_intercept_errors on;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }

}


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1125 次点击  
加入收藏 微博
5 回复  |  直到 2018-12-02 18:29:52
lobo
lobo · #1 · 6年之前

文章链接 http://tengine.taobao.org/book/chapter_02.html

nginx的进程模型,可以由下图来表示:

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

而基本的网络事件,则是放在worker进程中来处理了。

nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。

并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面

对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes

http://tengine.taobao.org/book/_images/chapter-2-1.PNG

lobo
lobo · #2 · 6年之前

IO多路复用模型epoll:

epoll通过在Linux内核中申请一个简易的文件系统,其工作流程分为三部分:

1、调用 int epoll_create(int size)建立一个epoll对象,内核会创建一个eventpoll结构体,用于存放通过epoll_ctl()向epoll对象中添加进来的事件,这些事件都会挂载在红黑树中。

2、调用 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) 在 epoll对象中为 fd 注册事件,所有添加到epoll中的件都会与设备驱动程序建立回调关系,也就是说,当相应的事件发生时会调用这个sockfd的回调方法,将sockfd添加到eventpoll 中的双链表。

3、调用 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)来等待事件的发生,timeout 为 -1 时,该调用会阻塞知道有事件发生。

这样,注册好事件之后,只要有 fd 上事件发生,epoll_wait() 就能检测到并返回给用户,用户就能”非阻塞“地进行 I/O 了。

epoll() 中内核则维护一个链表,epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了。

能达到这种效果,是因为在内核实现中 epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。

那么,某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,来把这个 sockfd 加入链表,其他处于“空闲的”状态的则不会。在这点上,epoll 实现了一个”伪”AIO。

例子:Nginx 会注册一个事件:“如果来自一个新客户端的连接请求到来了,再通知我”,此后只有连接请求到来,服务器才会执行 accept() 来接收请求。又比如向上游服务器(比如 PHP-FPM)转发请求,并等待请求返回时,这个处理的 worker 不会在这阻塞,它会在发送完请求后,注册一个事件:“如果缓冲区接收到数据了,告诉我一声,我再将它读进来”,于是进程就空闲下来等待事件发生。

lobo
lobo · #3 · 6年之前

AIO 简介:

在传统的 I/O 模型中,有一个使用惟一句柄标识的 I/O 通道。在 UNIX® 中,这些句柄是文件描述符(这对等同于文件、管道、套接字等等)。在阻塞 I/O 中,我们发起了一次传输操作,当传输操作完成或发生错误时,系统调用就会返回。

在异步非阻塞 I/O 中,我们可以同时发起多个传输操作。这需要每个传输操作都有惟一的上下文,这样我们才能在它们完成时区分到底是哪个传输操作完成了。在 AIO 中,这是一个 aiocb(AIO I/O Control Block)结构。这个结构包含了有关传输的所有信息,包括为数据准备的用户缓冲区。在产生 I/O (称为完成)通知时,aiocb 结构就被用来惟一标识所完成的 I/O 操作。这个 API 的展示显示了如何使用它。

image.png

lobo
lobo · #4 · 6年之前

主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。

通过这些IPC机制,用户空间进程之间可以完成互相通信。为了完成内核空间与用 户空间通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。

到目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs,其中模块参数与sysfs、 procfs、debugfs、relayfs是基于文件系统的通信机制,用于内核空间向用户控件输出信息;sysctl、系统调用是由用户空间发起的通 信机制。

由此可见,以上均为单工通信机制,在内核空间与用户空间的双向互动数据交换上略显不足。Netlink是基于socket的通信机制,由于 socket本身的双共性、突发性、不阻塞特点,因此能够很好的满足内核与用户空间小量数据的及时交互,因此在Linux 2.6内核中广泛使用,例如SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables,netfilter与 iptables的数据交换就是通过Netlink机制完成。

lobo
lobo · #5 · 6年之前
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传