配置Nginx作为一个Web服务器

一、设置虚拟服务节点

Nginx配置文件必须包含至少一个server指令来指明一个虚拟服务,当Nginx处理一个请求时,第一步就是选择虚拟节点来处理该请求。一个虚拟服务通过server指令在http上下文中定义:

http {
    server {
        # Server configuration
    }
}

可以在http上下文中添加多个server指令以配置冬瓜虚拟服务。server指令配置块中通常包含一个监听指令,以指定服务监听哪一个IP地址和端口:

server {
    listen 127.0.0.1:8080;
    # Additional server configuration
}

如果listen指令中没有指定端口,将使用标准端口。如果没有指定IP地址,将监听所有的IP地址。如果server指令配置块中没有listen指令,该server将监听80/tcp 或8000/tcp,取决于超级用户的权限。如果有多个server都匹配请求的IP和端口,Nginx将会通过server配置块中的server_name指令设置的值来和请求头中的Host进行比对筛选。server_name 参数可以是完整(精确)名称、通配符或正则表达式。通配符是在其开头、结尾或两者都包含星号 (*) 的字符串;星号匹配任何字符序列。使用正则表达式时需用~开头。下例展示了一个精确匹配的配置:

server {
    listen      80;
    server_name example.org www.example.org;
    #...
}

如果有多个名称与请求头中的 Host 匹配,NGINX将按匹配度来选择最匹配的一个。如果没有匹配的server,Nginx将把请求分配给默认的server,默认server即Nginx配置文件中第一个配置的server,或者server配置块中使用的listen指令使用了default_server的server:

server {
    listen 80 default_server;
    #...
}

二、配置路径

Nginx能够根据请求URI将请求路由给服务中的各个代理或提供不同的文件服务。该功能通过server中的location指令配置。例如,你可以在server中定义多个location,来将请求路由给多个代理服务,location指令的参数值可以是字符串和正则表达式,分发请求时将按照最佳匹配的进行路由请求,其中字符串比正则表达式优先级高,下例中,将匹配以/some/path/开头的URI:

location /some/path/ {
    #...
}

location ~ \.html? {
    #...
}

三、在配置文件中使用变量

Nginx配置文件中,变量是以$开头的符号,在nginx运行时会对变量进行动态解析。可以通过set、map和geo指令来自定义变量。Nginx也定义了许多预定义变量,例如$remote_addr(包含客户端IP地址),$uri(包含当前URI的值)

四、提供静态内容

root 指令指定将用于搜索文件的根目录。为了获取请求文件的路径,NGINX 将请求 URI 附加到由 root 指令指定的路径。该指令可以放置在 http {}、server {} 或location {} 上下文中。在下面的示例中,为server定义了 root 指令。

server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ \.(mp3|mp4) {
        root /www/media;
    }
}

在这里,NGINX 在文件系统的 /www/data/images/ 目录中搜索以 /images/ 开头的 URI。但如果 URI 以 .mp3 或 .mp4 扩展名结尾,NGINX 会在 /www/media/ 目录中搜索该文件,因为它匹配在location块中定义的路径。

如果请求以斜杠/结尾,NGINX 会将其视为对目录的请求,并尝试在该目录中查找索引文件。index指令定义索引文件的名称(默认值是的index.html)。继续这个例子,如果请求 URI 是 /images/some/path/,NGINX 会传送文件 /www/data/images/some/path/index.html(如果它存在)。如果没有,默认情况下,NGINX 返回 HTTP 代码 404(未找到)。要将 NGINX 配置为返回自动生成的目录列表,请在 autoindex 指令中包含 on 参数。你可以在 index 指令中列出多个文件名。 NGINX 按照指定的顺序搜索文件并返回它找到的第一个文件:

location /images/ {
    autoindex on;
    index index.html index.htm index;
}

为了返回索引文件,NGINX 检查它是否存在,然后通过将索引文件的名称附加到基本 URI 来进行内部重定向 到新URI。内部重定向会导致对某个位置进行新的搜索,并且可能会在另一个位置结束,如下例所示:

location / {
    root /data;
    index index.html index.php;
}

location ~ \.php {
    fastcgi_pass localhost:8000;
    #...
}

在这里,如果请求中的 URI 是 /path/,并且 /data/path/index.html 不存在但 /data/path/index.php 存在,则内部重定向到的 /path/index.php 将映射到第二个location。结果,请求被代理到localhost:8000。

五、尝试选项

try_files 指令可用于检查指定的文件或目录是否存在;如果有,NGINX 会进行内部重定向,如果没有,则返回指定的状态代码。例如,要检查与请求 URI 对应的文件是否存在,使用 try_files 指令和 $uri 变量,如下所示:

server {
    root /www/data;

    location /images/ {
        try_files $uri /images/default.gif =404;
    }
}

如果原始 URI 对应的文件不存在,NGINX 将内部重定向到最后一个参数指定的 URI,返回 /www/data/images/default.gif。或者/www/data/images/default.gif也不存在的话返回404。也可以通过变量来指定重定向的路径,如下所示:

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

六、优化内容服务的性能

加载速度是提供任何内容的关键因素。对 NGINX 配置进行小幅优化可能会提高生产力并帮助达到最佳性能。

启用sendfile
默认情况下,NGINX 自己处理文件传输,并在发送之前将文件复制到缓冲区中。启用 sendfile 指令消除了将数据复制到缓冲区的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了防止一个快速连接完全占用工作进程,您可以使用 sendfile_max_chunk 指令来限制在单个 sendfile() 调用中传输的数据量(在本例中为 1 MB):

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    #...
}

启用tcp_nopush
将 tcp_nopush 指令与 sendfile on;指令一起使用。这使 NGINX 能够在 sendfile() 获取数据块后立即在一个数据包中发送 HTTP 响应标头。

location /mp3 {
    sendfile   on;
    tcp_nopush on;
    #...
}

启用tcp_nodelay
tcp_nodelay 指令允许覆盖 Nagle 的算法,最初旨在解决慢速网络中小数据包的问题。该算法将多个小数据包合并为一个大数据包,并以 200 毫秒的延迟发送数据包。如今,在服务大型静态文件时,无论数据包大小如何,都可以立即发送数据。延迟还会影响在线应用程序(ssh、在线游戏、在线交易等)。默认情况下,tcp_nodelay 指令设置为 on,这意味着禁用 Nagle 算法。仅将此指令用于保持活动连接:

location /mp3  {
    tcp_nodelay       on;
    keepalive_timeout 65;
    #...
}

优化等待队列
NGINX 有多快的重要因素之一是处理传入连接的速度。一般规则是在建立连接后,将其放入侦听套接字的“侦听”队列中。在正常负载下,要么队列很小,要么根本没有队列。但是在高负载下,队列会急剧增长,从而导致性能不均、连接断开和延迟增加。为了获得最佳性能,您需要在操作系统和 NGINX 配置中增加可以排队等待 NGINX 接受的最大连接数。
例如将 net.core.somaxconn 内核参数的值从其默认值 (128) 增加到足够高的值以处理大量突发流量。在本例中,它增加到 4096。

  • 调整linux系统
sudo sysctl -w net.core.somaxconn=4096
  • 调整nginx
server {
    listen 80 backlog=4096;
    # ...
}

七、重写请求URI

一个请求URI能够在请求处理过程中通过使用rewrite指令修改多次,rewrite指令有一个可选参数和两个必写参数。第一个参数(必需)是一个用于匹配URI的真正表达式,第二个参数是要替换匹配 URI 的 URI。可选的第三个参数是一个标志,可以停止处理进一步的rewrite指令或发送重定向(代码 301 或 302)。例如:

location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}

在上面的例子中,通过正则表达式来匹配含有users的URI。你可以在server或者location中使用多个rewrite指令,nginx会按照它们出现的顺序依次执行。当URI被rewrite后,nginx再根据新的URI来选择location。

server {
    #...
    rewrite ^(/download/.*)/media/(\w+)\.?.*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(\w+)\.?.*$ $1/mp3/$2.ra  last;
    return  403;
    #...
}

该例中定义了两个rewrite,如果请求URI为/download/some/media/file,将会被修改为/download/some/mp3/file.mp3,由于last标志,后续指令(第二次重写和返回指令)将被跳过,但 NGINX继续处理请求,该请求现在具有不同的 URI。类似的,URI /download/some/audio/file 将会被修改为 /download/some/mp3/file.ra。除了last外,还有一个标志值break,它会停止处理当前上下文中的rewrite指令并取消对与新 URI 匹配的location的搜索。

八、重写Http响应

有时你需要重写或更改 HTTP 响应中的内容,用一个字符串替换另一个字符串。您可以使用 sub_filter 指令来定义要应用的重写。该指令支持变量和替换链,使更复杂的更改成为可能。例如,你可以更改引用非代理服务器的绝对链接:

location / {
    sub_filter      /blog/ /blog-staging/;
    sub_filter_once off;
}

九、错误处理

通过 error_page 指令,您可以为 NGINX配置返回自定义错误页面和错误代码,在响应中替换不同的错误代码,或将浏览器重定向到不同的 URI。在以下示例中,error_page 指令指定要返回的带有 404 错误代码的页面 (/404.html)。

error_page 404 /404.html;

需要注意的是该指令并不意味着立即返回错误(返回指令会这样做),而只是指定了在错误发生时如何处理错误。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值