天天看点

Nginx的工作原理和配置详解

Nginx是一款免费的、开源的、高性能的HTTP服务器、反向代理服务器、邮件代理服务器。是由俄罗斯人Igor Sysoev人在2002研发成功的,2004年发布第一版公共稳定版。到目前为止,Ngnix市场所占额是12.18%。Nginx以它的高性能,稳定性,丰富特性(第三方模块的支持),配置简单和较低的资源消耗著称。

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

1. 读取并验正配置信息;

2. 创建、绑定及关闭套接字;

3. 启动、终止及维护worker进程的个数;

4. 无须中止服务而重新配置工作特性;

5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;

6. 重新打开日志文件,实现日志滚动;

7. 编译嵌入式perl脚本;

1. 接收、传入并处理来自客户端的连接;

2. 提供反向代理及过滤功能;

3. nginx任何能完成的其它任务;

1. 检查缓存存储中的缓存对象;

2. 使用缓存元数据建立内存数据库;

1. 缓存的失效及过期检验;

具体,更详细的内容参照官网:nginx.org

说明: 这里所使用的操作系统类型,CentOS 6.5

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>1、解决依赖关系</code>

<code># yum groupinstall "Development Tools" "Server Platform Deveopment" -y</code>

<code>yum </code><code>install</code> <code>openssl-devel pcre-devel -y</code>

<code>2、安装</code>

<code>首先添加用户nginx,实现以之运行nginx服务进程:</code>

<code># groupadd -r nginx</code>

<code># useradd -r -g nginx nginx</code>

<code>接着开始编译和安装:</code>

<code># ./configure \</code>

<code>  </code><code>--prefix=</code><code>/usr/local/nginx</code> <code>\   -----&gt; Nginx的安装目录</code>

<code>  </code><code>--error-log-path=</code><code>/data/applogs/nginx/error</code><code>.log \   -----&gt; Nginx的错误日志</code>

<code>  </code><code>--http-log-path=</code><code>/data/applogs/nginx/access</code><code>.log \   -----&gt; Ngnix的访问日志</code>

<code>  </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid  \    -----&gt; Nginx的pid文件</code>

<code>  </code><code>--lock-path=</code><code>/var/lock/nginx</code><code>.lock \ -----&gt; Nginx锁文件位置</code>

<code>  </code><code>--user=nginx \ -----&gt; Nginx进程运行时的用户</code>

<code>  </code><code>--group=nginx \    -----&gt; Nginx进程运行时的组</code>

<code>  </code><code>--with-http_ssl_module \   -----&gt; 添加 SSL 模块</code>

<code>  </code><code>--with-http_flv_module \   -----&gt; 添加 flv 格式的模块</code>

<code>  </code><code>--with-http_stub_status_module \   -----&gt; 添加 stub_status 模块</code>

<code>  </code><code>--with-http_gzip_static_module \   -----&gt; 添加 gzip_static 模块</code>

<code>  </code><code>--http-client-body-temp-path=</code><code>/usr/local/nginx/client/</code> <code>\    -----&gt; 客户端实体存放位置</code>

<code>  </code><code>--http-proxy-temp-path=</code><code>/usr/local/nginx/proxy/</code> <code>\   -----&gt; 代理配置目录</code>

<code>  </code><code>--http-fastcgi-temp-path=</code><code>/usr/local/nginx/fcgi/</code> <code>\  -----&gt; fastcgi位置 (php)</code>

<code>  </code><code>--http-uwsgi-temp-path=</code><code>/usr/local/nginx/uwsgi</code> <code>\    -----&gt; uwsgi位置 (python)</code>

<code>  </code><code>--http-scgi-temp-path=</code><code>/usr/local/nginx/scgi</code> <code>\      -----&gt; scgi配置的位置</code>

<code>  </code><code>--with-pcre -----&gt; 支持pcre</code>

<code># make &amp;&amp; make install</code>

说明:这里使用的安装方式是rmp安装方式。

安装的节点:172.16.10.77

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663464PcS2.png" target="_blank"></a>

<code>Nginx的配置有着几个不同的上下文:main、http、server、upstream和location(还有实现邮件服务</code>

<code>反向代理的mail)。</code>

<code>配置语法的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维</code>

<code>护等优势。</code>

<code>Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web</code>

<code>  </code><code>和Mail反向代理的功能;</code>

<code>还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多</code>

<code>  </code><code>跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。</code>

<code>这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和</code>

<code>  </code><code>负载均衡几个类别,这些共同组成了nginx的http功能。</code>

<code>事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同)事件通知机制如kqueue或epoll等</code>

<code>  </code><code>。</code>

<code>协议模块则负责实现nginx通过http、tls</code><code>/ssl</code><code>、smtp、pop3以及imap与对应的客户端建立会话。</code>

<code>在nginx内部,进程间的通信是通过模块的pipeline或chain实现的;</code>

<code>换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与</code>

<code>   </code><code>upstream服务器通信,以及与memcached建立会话等。</code>

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<code>[root@localhost nginx]</code><code># cat nginx.conf</code>

<code>user  nginx;  </code>

<code>worker_processes  1;</code>

<code>error_log  </code><code>/var/log/nginx/error</code><code>.log warn;</code>

<code>pid        </code><code>/var/run/nginx</code><code>.pid;</code>

<code>events {</code>

<code>    </code><code>use epoll;</code>

<code>    </code><code>worker_connections  1024;</code>

<code>}</code>

<code>http {</code>

<code>    </code><code>include       </code><code>/etc/nginx/mime</code><code>.types;</code>

<code>    </code><code>default_type  application</code><code>/octet-stream</code><code>;</code>

<code>    </code><code>log_format  main  </code><code>'$remote_addr - $remote_user [$time_local] "$request" '</code>

<code>                      </code><code>'$status $body_bytes_sent "$http_referer" '</code>

<code>                      </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>

<code>    </code><code>access_log  </code><code>/var/log/nginx/access</code><code>.log  main;</code>

<code>    </code><code>sendfile        on;</code>

<code>    </code><code>keepalive_timeout  65;</code>

<code>    </code><code>server {</code>

<code>                </code><code>listen 80;</code>

<code>                </code><code>add_header X-Via $server_addr;</code>

<code>                </code><code>server_name www.example.com;</code>

<code>                </code><code>location / {</code>

<code>                        </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>

<code>                        </code><code>index  index.html index.htm;</code>

<code>            </code><code>rewrite ^</code><code>/imgs/</code><code>(.*)$ </code><code>/images/</code><code>$1 </code><code>break</code><code>;  </code><code># 重写url</code>

<code>                </code><code>}</code>

<code>                </code><code>location </code><code>/status</code> <code>{</code>

<code>                        </code><code>stub_status on;</code>

<code>        </code><code># 设置用户认证,认证文件需要使用htpasswd命令生成</code>

<code>                </code><code>location </code><code>/admin</code> <code>{</code>

<code>                        </code><code>index index.html;</code>

<code>                        </code><code>auth_basic           </code><code>"admin pass"</code><code>;</code>

<code>                        </code><code>auth_basic_user_file </code><code>/etc/nginx/htpasswd</code><code>;</code>

<code>                </code><code>location </code><code>/bbs</code> <code>{</code>

<code>                        </code><code>proxy_pass http:</code><code>//172</code><code>.16.10.16/;</code>

<code>    </code><code>}</code>

<code>    </code><code>include </code><code>/etc/nginx/conf</code><code>.d/*.conf;</code>

结果示例:

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_14116634705Ifz.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663475L9Pj.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663477h582.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663478Tiks.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663479UPOh.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663480GNku.png" target="_blank"></a>

Nginx的反向代理是由proxy模块实现的。结合upstream模块实现简单的负载均衡。

56

57

<code>user  nginx;</code>

<code>    </code><code>proxy_cache_path </code><code>/data/cache</code>  <code>levels=1:2   keys_zone=web:10m max_size=512m;</code>

<code>    </code><code>upstream web {</code>

<code>        </code><code>#ip_hash;</code>

<code>        </code><code>server 172.16.10.11:80; </code>

<code>        </code><code>server 172.16.10.9:80;</code>

<code>        </code><code>server 172.16.10.16:80 weight=1;     </code>

<code>        </code><code>server 172.16.10.77:8080 backup;     </code>

<code>        </code><code>listen 80;</code>

<code>        </code><code>add_header X-Via $server_addr;</code>

<code>        </code><code>add_header X-Cache-Status $upstream_cache_status;</code>

<code>        </code><code>server_name www.example.com;</code>

<code>        </code><code>location / {</code>

<code>            </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>

<code>            </code><code>proxy_pass http:</code><code>//web</code><code>;</code>

<code>                </code><code>proxy_cache web;</code>

<code>                </code><code>proxy_cache_valid 200 1d;</code>

<code>                </code><code>proxy_cache_valid 301 302 10m;</code>

<code>                </code><code>proxy_cache_valid any 1m;</code>

<code>                </code><code>index  index.html index.htm;</code>

<code>            </code><code>if</code> <code>($request_method ~* </code><code>"PUT"</code><code>) {</code>

<code>                </code><code>proxy_pass http:</code><code>//172</code><code>.16.10.11;</code>

<code>                </code><code>break</code><code>;</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>    </code> 

<code>   </code><code>}</code>

结果展示:

如果没有缓存数据,会根据调度算法调度到后端的real server.

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_141166348186hZ.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_14116634854Ub5.png" target="_blank"></a>

<code># 在对应的server段添加以下,就可实现 fastcgi 代理</code>

<code>location ~ \.php$ {</code>

<code>                        </code><code>root </code><code>/php</code><code>;</code>

<code>                        </code><code>fastcgi_pass 172.16.10.11:9000;</code>

<code>                        </code><code>fastcgi_index index.php;</code>

<code>                        </code><code>fastcgi_param  SCRIPT_FILENAME  </code><code>/scripts</code><code>$fastcgi_script_name;</code>

<code>                        </code><code>include        fastcgi_params;</code>

<code>[root@localhost nginx]</code><code># cat fastcgi_params</code>

<code>fastcgi_param  GATEWAY_INTERFACE  CGI</code><code>/1</code><code>.1;</code>

<code>fastcgi_param  SERVER_SOFTWARE    nginx;</code>

<code>fastcgi_param  QUERY_STRING       $query_string;</code>

<code>fastcgi_param  REQUEST_METHOD     $request_method;</code>

<code>fastcgi_param  CONTENT_TYPE       $content_type;</code>

<code>fastcgi_param  CONTENT_LENGTH     $content_length;</code>

<code>fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;</code>

<code>fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;</code>

<code>fastcgi_param  REQUEST_URI        $request_uri;</code>

<code>fastcgi_param  DOCUMENT_URI       $document_uri;</code>

<code>fastcgi_param  DOCUMENT_ROOT      $document_root;</code>

<code>fastcgi_param  SERVER_PROTOCOL    $server_protocol;</code>

<code>fastcgi_param  REMOTE_ADDR        $remote_addr;</code>

<code>fastcgi_param  REMOTE_PORT        $remote_port;</code>

<code>fastcgi_param  SERVER_ADDR        $server_addr;</code>

<code>fastcgi_param  SERVER_PORT        $server_port;</code>

<code>fastcgi_param  SERVER_NAME        $server_name;</code>

<code># 在172.16.10.11上配置好,php-fpm环境</code>

<code>yum </code><code>install</code> <code>php-fpm</code>

<code> </code> 

<code>配置监听端口: </code><code>/etc/php-fpm</code><code>.d</code><code>/www</code><code>.conf </code>

<code>listen = 172.16.10.11:9000</code>

<code>允许访问端口:注释表示any</code>

<code>;listen.allowed_clients = 127.0.0.1</code>

<code>mkdir</code> <code>/php</code>

<code>vim </code><code>/php/index</code><code>.php</code>

<code>&lt;?php</code>

<code>phpinfo();</code>

<code>?&gt;</code>

<code>启动php-fpm</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663488bDP9.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/25/8886857_1411663490OsKx.png" target="_blank"></a>

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1558304,如需转载请自行联系原作者