Nginx简介

本文主要介绍以下几个与Nginx相关的内容:

  1. Nginx是什么?
  2. Nginx的安装与配置?
  3. Nginx核心架构简介

1. Nginx是什么

Nginx官网介绍Nginx是一个Http服务器,是一个反向代理服务器,是一个邮件代理服务器,同时又是一个普通的TCP/UDP代理服务器。最初由Igor Sysoev编写。Nginx已经在很多高负载的俄罗斯网站上面运行。根据Netcraft公司的数据,截止到2016年10月份Nginx已经为27.8%的商业网站提供服务,比如Netflix, Wordpress.com, Hulu,FastMail.FM等。

Nginx是少数解决了C10K problem问题的服务器。不像传统的服务器,Nginx不依赖于线程来处理请求;相反它使用更具拓展性的异步事件驱动机制(event-driven)框架来完成这个工作。Nginx应用范围很广,可应用于很小的VPS服务器,也可应用到大规模服务器集群。(参考Nginx documention)。

1.2 Nginx与Apache、Tomcat区别

关于服务器,我们听到的最多的就是Apache、Nginx和Tomcat。但三者区别去鲜有人提及。这里简单罗列一下三者的区别:

  1. Apache和Nginx常作为Http Server使用,而Tomcat则是一个应用服务器(Application Server).
  2. Apache是目前使用最多的Http Server,因为Apache是一个稳定、开源、跨平台的Web服务器;出现时间较早,Bug少,各种模块功能齐全(Apache Http Server)。Apache不支持高并发,在有大量的HTTP请求时,会创建大量的进程来响应请求;是的进程间切换耗时增加,继而导致HTTP请求的平均响应速度降低。
  3. Nginx则是轻量级、高并发的Web服务器。采用异步的事件驱动机制,可以满足高并发的请求。
  4. 还有一种常用的Web服务器是lighttd,三者的优缺点对比可参考apache lighttpd nginx比较

HTTP Server处理的是HTTP 协议层面的传输和访问控制,所以在Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML,JS,CSS,images等资源文件);通过 CGI 技术,也可以将处理过的内容通过HTTP Server分发。但是HTTP Server只是把服务器端的资源通过HTTP协议下发给客户端,却无法对这些资源文件进行修改;换句话说,Http Server只能处理静态资源的请求。

通常我们需要网页提供一些实时的、可变的信息(比如天气、时间、IP地址、个人用户中心等)等界面的时候,Http Server就无法完全满足需求。这些包含了实时的、可变的信息的页面,被称为动态页面。动态页面需要服务器根据不同的时间、用户、IP等信息,单独生成一个界面返回给不同的用户;这就是Tomcat、jboss、jetty等Application Server的应用场景了。

应用服务器是一个应用执行的容器,能够执行相应的代码;比如Tomcat能够执行Java代码(JSP和Servlet)。当然,Tomcat等应用服务器也可以作为Http服务器来使用(比如在获取一个页面时,如果该页面不需要执行任何代码,那么该页面就可以看做是一个静态页面)。

更多Web Server和Application Server的区别,请阅读博客Web Server vs Application Server.

2 Nginx的安装与配置

本节主要介绍在Ubuntu系统上面安装、配置Nginx服务器;以及Ubuntu系统上Nginx常用的命令。

2.1 Nginx的安装

Ubuntu中有两种安装Nginx的方式(Nginx install):

  1. 使用apt-get命令安装;具体命令如下:
    sudo apt-get update
    sudo apt-get install nginx
  2. 下载Nginx的源码进行编译安装;具体步骤如下(INSTALLING NGINX OPEN SOURCE):
    • 安装编译依赖库pcre、zlib、openssl等依赖库;
    • 获取Nginx最新版本1.10.1的源代码,并解压;
    • 配置Nginx并make安装。
    • 在编译安装的过程中,可以对nginx的安装进行配置,各个配置参数说明请参考官方文档Installation and Compile-Time Options.

本人将整个安装编写成一个Shell脚本,请下载nginx-install.sh.

2.2 Nginx配置简介

本小节首先对两种不同的安装方式的配置目录进行说明,然后介绍如何配置Nginx服务器。

2.2.1 Nginx配置文件说明

使用apt-get命令安装时,Ubuntu默认将Nginx的各种文件进行拆分放置:

  • 将nginx可执行程序存放于/usr/sbin/nginx.(可使用which nginx 命令查看);
  • 将nginx的配置文件存放于/etc/nginx/nginx.conf;
  • 默认的根目录设置为/usr/share/nginx/html/.
  • 其他配置信息,查看/etc/nginx/site-enable/default文件即可知.

整体的目录结构如下图:

/etc/nginx/ 
├── conf.d
├── fastcgi.conf 
├── fastcgi_params 
├── koi-utf 
├── koi-win 
├── mime.types 
├── nginx.conf 
├── scgi_params 
├── uwsgi_params  
├── win-utf 
├── sites-available
│ ├── default
├── sites-enabled
│ ├── default
├── naxsi_core.rules
└── nginx.conf

使用源码编译进行安装的文件,配置文件在运行./configure的过程中指定。使用源码安装时,本人的配置如下所示:

./configure
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-pcre=../pcre-8.39
--with-zlib=../zlib-1.2.8
--with-http_ssl_module
--with-stream
--with-mail=dynamic
--add-module=/usr/build/nginx-rtmp-module
--add-dynamic-module=/usr/build/3party_module

2.2.2 Nginx配置简介

Nginx核心配置文件nginx.conf说明

Nginx的核心配置是nginx.confg,其在/etc/nginx/目录下。该配置文件说明如下所示,详细信息请参考nginx-core-module

user www-data www-data; #用户,用户组
worker_processes 4; #工作进程的个数

error_log /var/log/nginx-error.log info; #错误日志路径
pid /run/nginx.pid;#主进程pid的存放路径
events {
    use epoll; #采用epoll事件循环机制,非阻塞、高并发连接
    worker_connections 2048; #单个进程的最大连接数
    # multi_accept on; #是否支持多连接
}
http {
    access_log  logs/access.log;#访问日志路径,一般查看请求是否过来

    server {
        listen 80; #http监听的端口号,默认80;一般都需要自己修改
        server_name  localhost; #当前服务器的域名,也可以写成ip形式

        location / {
            root   html; #根目录
            index  index.html index.htm;
        }

        error_page  404  /404.html; #http状态码返回404时映射的文件

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html; #http状态码返回50X时映射到50x.html文件
        location = /50x.html {
            root   html;
        }
    } 
}

其他核心配置,请参考官方文档nginx-core-module.

2.2.2.2 Nginx Location配置说明

Nginx http配置选项中的Location选项,主要用于配置html的匹配规则(具体参考nginx-location)。以下是一个Location的具体配置:

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}
location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ]
}
location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ]
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
}
location ~* /js/.*/\.js

匹配规则说明如下:

  • =开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
  • ~ 开头表示区分大小写的正则匹配;
  • ~* 开头表示不区分大小写的正则匹配
  • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

匹配的优先级是:

  • (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
  • 只有当高优先级的规则没有匹配成功时,才会进行下一个优先级规则的匹配工作。
  • 同一级优先级的匹配,以最长的匹配为准。且同一优先级匹配,在匹配度相同的情况下,以后面的匹配规则为准。

匹配案例说明:

  • / -> config A (精确完全匹配,即使/index.html也匹配不了 )
  • /downloads/download.html -> config B (匹配B以后,往下没有任何匹配,采用B )
  • /images/1.gif -> configuration D (匹配到F,往下匹配到D,停止往下 )
  • /images/abc/def -> config D (最长匹配到G,往下匹配D,停止往下 你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序 )
  • /documents/document.html -> config C (匹配到C,往下没有任何匹配,采用C )
  • /documents/1.jpg -> configuration E (匹配到C,往下正则匹配到E )
  • /documents/Abc.jpg -> config CC (最长匹配到C,往下正则顺序匹配到CC,不会往下到E)

本小节中的案例来自博客nginx配置location总结及rewrite规则写法.

2.3 配置多个Server

本小节主要讲解如何在Ubuntu上使用Nginx来实现一台电脑一个端口(80)搭建多个网站。具体配置可参考博客Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机).

配置多Server的主要步骤概括如下:

  • 在/etc/nginx/conf.d/目录下添加新的.conf文件,该文件的写法参考/etc/nginx/sites-enable/default文件中server的写法;
  • 在编写好了配置文件之后,使用以下命令查看配置是否正确:
    sudo nginx -t
  • 如果测试通过,则使用以下命令重启nginx服务器:
    sudo service nginx restart

Nginx在配置多个Server时,需要考虑listener端口的问题,其中listen端口的配置格式如下所示:

listen address[:port] [default_server] [ssl] [http2 | spdy]
listen port [default_server] [ssl] [http2 | spdy]

2.4 Nginx常用的命令

在Ubuntu中运行和维护Nginx常见的命令可参考博客nginx常用命令.本人常用的命令有:

sudo nginx -t
sudo service nginx restart
nginx -v
ps -ef|grep nginx
nginx -s reload
kill -QUIT `cat /var/run/nginx.pid`

2.5 百度Nginx安全配置标准

为了保证 nginx 配置安全,防止信息泄露,恶性攻击,配置的标准规范等,特制定 nginx 安全配置标准,此标准从安全、性能等方面进行配置标准化。公司内部对Nginx的配置了专门的规范。该标准标准适用于 nginx 0.7.x,nginx 0.8.x。

安全规范具体内容请参考:百度 Nginx 安全配置标准

3 Nginx核心架构简介

Nginx一个重要的特征便是模块化接口,

参考文献

  1. nginx install
  2. installing-nginx-open-source
  3. nginx-core-module
  4. Nginx 配置 HTTPS 服务器
  5. Nginx配置文件(nginx.conf)配置详解
  6. Web Server vs Application Server
  7. nginx模块化开发
  8. nginx安装及简要配置
  9. <深入理解Nginx--模块开发与架构解析>
  10. 初识nginx——配置解析篇
  11. 百度 Nginx 安全配置标准

results matching ""

    No results matching ""