Nginx入门指南,快速搭建静态文件服务器和代理服务器

本文介绍 Nginx 入门基础知识,让你迅速搭建 Nginx 服务器。主要内容包括 Nginx 安装和简单使用、Nginx的简单原理、Nginx 配置文件的结构、如何使用 Nginx 来提供静态文件服务、如何使用 Nginx 来搭建简单的代理服务器等知识。

一、Nginx 的安装和简单使用

关于 Nginx 的安装、简单使用以及详细的命令行参数介绍请参考 http://blog.lifw.org/post/91978153

二、Nginx 的简单原理

如果使用 Nginx 作为web服务器,那么 Nginx 收到请求后将请求内容响应到客户端。如果使用 Nginx 作为代理服务器,那么 Nginx 收到请求后将请求转发到代理服务器(例如tomcat),代理服务器处理完请求后将响应内容发送给 Nginx ,最后 Nginx 将响应内容发送给客户端。

Nginx 是多进程架构,有一个主进程和若干工作进程。主进程主要用来读取并检测配置文件、管理工作进程。工作进程用来处理客户端请求。Nginx 采用基于事件的模型和独立于操作系统的机制来高效地将请求分发到工作进程。工作进程的个数可以在配置文件中显式指定,也可以由 Nginx 根据 CPU 核心数来自动确定。通常工作进程个数和 CPU 核心数相同。

三、Nginx 配置文件结构

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
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    server {
      location / {
        root /data/www;
      }
      location /images/ {
        root /data;
      }
    }
}

配置文件基本结构就是这样子,由若干指令(directives)构成。指令分为简单指令(siple directives)和块指令(block directives)。简单指令由指令名和参数构成,指令名和参数以空格分隔,每条指令以分号结尾。例如

user nginx;

这就是一条简单指令,表示以 nginx 这个用户身份运行 nginx 工作进程。指令名为 user ,参数为 nginx,最后分号结束。

块指令由指令名和若干由花括号{}包围起来的一组指令组成。例如

events {

worker_connections 1024;

}

就是一个块指令,指令名为 events,后面紧跟 {} 包围起来的一组指令。

如果一个块指令内有其他指令,那么这个块指令也成为上下文(context),不在任何上下文中的指令被认为是在主上下文中(main context)。例如 events 和 http 位于主上下文中,server 位于 http 上下文中,location 则位于 server 上下文中。

以井号#开头的行是注释行,不起作用。

四、使用 Nginx 来提供静态文件服务

Nginx 一大经典使用场景就是用来提供静态文件服务,例如图片、html、脚本、样式文件等,这些文件没有必要交给 tomcat、jboss等应用服务器处理,使用 Nginx 直接处理将大大提高性能。用 Nginx 来提供静态文件服务十分简单,只需要添加一个 server 块指令即可。

假设我们的静态文件位于 /srv/www 目录下,有若干图片、html、脚本、样式等文件,在 http 指令中加入一个 server 指令即可,代码如下

1
2
3
4
5
6
7
8
9
#其他配置省略
...
http {
      server {
         location ~* \.(html|css|js|png|jpg|gif|ico)$ {
            root /srv/www;
         }
      }
}

location指令用来映射请求到本地文件系统,这里我们使用了简单的正则表达式来匹配html、css、js、png、jpg、gif、ico这些为扩展名的请求,注意 location 指令中使用表达式要用 ~ 或者 ~* 符号指明,~表示区分大小写,~* 表示不区分大小写。而 root 指令用来指定文件在服务器上的基路径,这里指定为 /srv/www。

不是太好理解,举个例子,例如客户端发送了一个 GET 请求 http://localhost/images/logo.png,Nginx 接受到该请求后会将该请求分发到匹配的 location 中处理,显然上面我们写的 location 指令可以截获该请求,接下来 nginx 将 request_uri 和 root 拼接成服务器文件系统路径,这里 request_uri 为 /images/logo.png,root 为 /srv/www ,拼接后路径为 /srv/www/images/logo.png ,最后 nginx 将服务器该图片响应给客户端,如果不存在该文件,则返回 404 。

五、使用 Nginx 来搭建简单的代理服务器

Nginx 另外一大经典使用场景就是用来作为代理服务器,通常和上述的静态文件服务器配合使用,来完成静态文件由 nginx 服务器提供,而复杂业务请求则由后面的应用服务器来处理。配置 nginx 为代理服务器也很简单,同样在 http 上下文中添加一个 server 指令即可,这里我们以 tomcat 为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
#其他配置省略
http {
  server {
     #静态文件由nginx处理
     location ~* \.(html|css|js|png|jpg|gif|ico)$ {
         root /srv/www;
     }
     #其他所有请求由tomcat处理
     location / {
         proxy_pass http://localhost:8080;
     }
  }
}

使用 proxy_pass 指令即可将匹配的请求转发到相应的代理服务器。这里我们同时配置了两个 location,第一个 location 来截获静态文件请求并将请求直接交给 nginx 处理,第二个 location 来截获除了静态文件之外的其他所有请求并将这些请求交给 tomcat 处理。这是 nginx 非常经典的使用方式。

本文链接:http://blog.lifw.org/post/52092805,博主原创文章,欢迎转载,转载请注明出处和链接。

本文来源:http://blog.lifw.org/post/52092805


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。