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>\ -----> Nginx的安装目录</code>
<code> </code><code>--error-log-path=</code><code>/data/applogs/nginx/error</code><code>.log \ -----> Nginx的错误日志</code>
<code> </code><code>--http-log-path=</code><code>/data/applogs/nginx/access</code><code>.log \ -----> Ngnix的访问日志</code>
<code> </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid \ -----> Nginx的pid文件</code>
<code> </code><code>--lock-path=</code><code>/var/lock/nginx</code><code>.lock \ -----> Nginx锁文件位置</code>
<code> </code><code>--user=nginx \ -----> Nginx进程运行时的用户</code>
<code> </code><code>--group=nginx \ -----> Nginx进程运行时的组</code>
<code> </code><code>--with-http_ssl_module \ -----> 添加 SSL 模块</code>
<code> </code><code>--with-http_flv_module \ -----> 添加 flv 格式的模块</code>
<code> </code><code>--with-http_stub_status_module \ -----> 添加 stub_status 模块</code>
<code> </code><code>--with-http_gzip_static_module \ -----> 添加 gzip_static 模块</code>
<code> </code><code>--http-client-body-temp-path=</code><code>/usr/local/nginx/client/</code> <code>\ -----> 客户端实体存放位置</code>
<code> </code><code>--http-proxy-temp-path=</code><code>/usr/local/nginx/proxy/</code> <code>\ -----> 代理配置目录</code>
<code> </code><code>--http-fastcgi-temp-path=</code><code>/usr/local/nginx/fcgi/</code> <code>\ -----> fastcgi位置 (php)</code>
<code> </code><code>--http-uwsgi-temp-path=</code><code>/usr/local/nginx/uwsgi</code> <code>\ -----> uwsgi位置 (python)</code>
<code> </code><code>--http-scgi-temp-path=</code><code>/usr/local/nginx/scgi</code> <code>\ -----> scgi配置的位置</code>
<code> </code><code>--with-pcre -----> 支持pcre</code>
<code># make && 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><?php</code>
<code>phpinfo();</code>
<code>?></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,如需转载请自行联系原作者