如何配置nginx

2017-08-22

nginx是一种轻量级的高性能Web服务器,旨在通过有效利用系统资源快速提供大量静态内容。nginx的优点是能够有效地提供静态内容,如纯HTML和媒体文件。有些人认为这是动态内容的理想服务器。

nginx

与使用线程或面向过程的方法来处理请求的Apache不同,nginx使用异步事件驱动模型,在负载下提供更可预测的性能。而不是使用嵌入式解释器方法,nginx将动态内容交给CGI,FastCGI或甚至Apache等其他Web服务器,然后将其传递回nginx以传送给客户端。

这导致某些部署更复杂的设置。由于这些和其他原因,起初,nginx的配置可能会感到复杂和不直观。本文档应该熟悉基本的nginx参数和约定。我们将通过nginx的主配置文件。

所有的nginx配置文件位于**/etc/nginx/目录中。主配置文件是/etc/nginx/nginx.conf**。

注:

如果从包管理器安装nginx,这是文件所在的位置。其他可能的位置包括/opt/nginx/conf/。

先决条件

在开始之前,请确保您已完成以下操作:

按照入门指南。

  • 安装nginx服务器。
  • 本指南要求的步骤需要root权限。请确保root使用sudo前缀运行以下步骤。有关权限的更多信息,请参阅我们的用户和组指南。

如果您刚接触Linux服务器管理员,您可能还对我们的“新手指南”和“ 管理基础指南”感兴趣。

开始之前

以下部分涵盖了在对nginx配置进行任何更改之前应该对其进行检查的几个概念和保护措施。

备份默认配置

有时候,服务器配置文件可能会被破坏或复杂化,使得它们变得不可用,所以始终是拥有必要文件的工作副本的好主意。一个很好的第一步是复制任何配置文件,然后再开始进行更改,如下所示:

# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

对于更好的恢复选项,我们建议定期备份您的nginx配置。您可能希望将整个/etc/nginx/目录存储在Git存储库中,以便您可以将原始设置和所有版本保存在所有不同的更改中。另一种选择是定期创建文件的日期副本。您可以通过发出以下命令来完成此操作:

# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date“+%b_%d_%Y_%H.%M.%S”)

Start, Stop, Reload

现在,您可以对nginx配置进行更改。每当您更改nginx.conf文件时,您需要重新加载配置,然后更改才会生效。您可以通过发出以下命令来执行此操作:

# service nginx reload

要完全停止或启动服务,请reloadstart或替换stop

语法简介

本部分将介绍从默认配置文件 /etc/nginx/nginx.conf

# /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

通常,您不需要在第一部分中更改任何内容。相反,我们将使用它作为解释配置文件语法的机会。

  • 前面有一个井号或hash(#)的所有行都是注释。这意味着它们不被nginx解释。程序员使用注释来解释某些代码块的做法,或者提供如何编辑值的建议。默认文件有几个注释部分用于说明,如果需要,您可以添加自己的。程序员还将留下可选语句作为注释。如果需要,可以通过拆下井号来“打开”。 上面显示了一个例子。该指令multi_accept on;有一个#在它的前面。这不是对用户的评论,而是一个可以通过删除的“激活”的指令#。
  • 设置以变量名开始,然后声明由空格分隔的参数或一系列参数。例子包括worker_processes 1;和error_log logs/error.log notice;。所有语句以分号(;)结尾。
  • 一些设置,如events上面的变量,具有自变量参数的参数。所有子指令都包含在一组大括号({ })中。
  • 托架有时会嵌套在多个子指令集中。如果您添加或编辑具有嵌套括号的部分,请确保它们都进入打开和关闭对。
  • 标签或多个空格由nginx解释为单个空格。以标准化方式使用制表符或空格进行缩进将大大提高文件的可读性,并使其更容易维护。

了解nginx的工作原理

现在我们了解语法,让我们进入nginx的坚果。首先,我们将介绍nginx.conf文件中的核心指令,定义Web服务器的基本行为。然后我们HTTP将更详细地解释该块,以及一些更常用的调整变量。从那里我们将移动到server块和虚拟主机配置文件。这是您将使用nginx定义要托管的网站时,您将编辑的部分。

定义指令

我们将首先解释核心指令,/etc/nginx/nginx.conf让我们回到第一部分:

# /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

user

定义哪个Linux系统用户将拥有和运行nginx服务器。大多数基于Debian的发行版都使用,www-data但在其他发行版中可能有所不同。有一些用例可以从改变用户的角度受益; 例如,如果您运行两个同时的Web服务器,或者需要另一个程序的用户来控制nginx。

worker_process

定义要运行的nginx有多少线程或并发实例。您可以了解有关此指令的更多信息以及在此处进行调整的值。

PID

定义nginx会写入其主进程ID或PID的位置。操作系统使用PID来跟踪和发送信号到nginx进程。

HTTP(通用配置)

该nginx.conf文件的下一部分涵盖了nginx在处理HTTP Web流量时的通用指令。HTTP块的第一部分如下所示:

# /etc/nginx/nginx.conf
http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

大多数http { }块应该按照大多数nginx配置工作。但是,我们希望提请您注意以下配置选项:

include

include本节开头的声明包含mime.types位于的文件/etc/nginx/mime.types。这意味着文件中写的任何东西都mime.types被解释为如果它被写入http { }块内。这允许您在http { }块中包含冗长的信息量,而不会使主配置文件混乱。尝试避免太多的链接包含(即,包括一个文件本身包含一个文件等)。如果可能,请保持一个或两个包含级别,以便可读性。您可以随时使用指令将所有文件包含在特定目录中:

include /etc/nginx/sites-enabled/*;

或者更具体地说,您可以将所有.conf文件包含在目录中:

include /etc/nginx/conf.d/*.conf;

gzip

gzip指令告诉服务器使用即时gzip压缩来限制使用的带宽量并加快一些传输。这相当于Apache的mod_deflate。可以在http块的此部分中取消注释其他设置,以修改gzip行为:

# /etc/nginx/nginx.conf
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

有关gzip选项的完整定义,请从nginx文档查看此页面

注:

如果您在此处启用gzip压缩功能,请注意,您正在交易增加的CPU成本,以换取您的较低带宽使用。设置为gzip_comp_level1到9之间的值,其中9需要最大量的CPU资源,1需要最少。默认值为1。

请注意,上面显示的代码片段不包括关闭括号(}),因为HTTP部分未完成。有关HTTP块中每个指令的详细说明,请从nginx文档中查看此页面

Server (Virtual Domains 配置)

nginx.conf文件的HTTP块包含该语句include /etc/nginx/sites-enabled/*;。这允许从sites-enabled子目录中找到的单独文件加载服务器块配置。通常这些是存储在文件中的符号链接**/etc/nginx/sites-available/**。通过使用符号链接,您可以快速启用或禁用虚拟服务器,同时保留其配置文件。nginx提供了一个默认的虚拟主机文件,可以将其用作为其他域创建虚拟主机文件的模板:

# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

现在我们来看看组成server块的指令和设置:

# /etc/nginx/sites-available/default
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
}

server块是典型的nginx用户将其大部分更改作为默认配置的地方。通常,您将要为server服务器上的每个虚拟域制作一个单独的文件,其中包含自己的块。以下部分将显示服务器块的更多配置选项。

Listening Ports

listen位于server块中的指令告诉nginx主机名/ IP以及应该监听HTTP连接的TCP端口。默认情况下,nginx将侦听端口上的HTTP连接80。

接下来,我们将介绍一些常用的listen指令示例。

注:

listen如果需要,您可以使用多个指令。

# /etc/nginx/sites-available/default
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

这些是默认虚拟主机文件中的默认listen语句。该参数default_server意味着此虚拟主机将回答端口80上不专门匹配另一个虚拟主机的listen语句的请求。第二个语句监听IPv6,并以相同的方式运行。

# /etc/nginx/sites-available/example.com
listen     127.0.0.1:80;
listen     localhost:80;

这两个例子直接指向nginx来监听127.0.0.1; 即本地环回接口。localhost通常在**/etc/hosts设置为127.0.0.1**。

# /etc/nginx/sites-available/example.com
listen     127.0.0.1:8080;
listen     localhost:8080;

第三对示例也会侦听本地主机,但是它们会侦听端口上的响应8080而不是端口80

listen     192.168.3.105:80;
listen     192.168.3.105:8080;

第四对示例指定监听IP地址上的请求的服务器192.168.3.105。第一个侦听端口80,第二个端口8080。

# /etc/nginx/sites-available/example.com
listen     80;
listen     *:80;
listen     8080;
listen     *:8080;

第五组示例告诉nginx监听特定端口上的所有域和IP地址。listen 80;相当于listen *:80;listen 8080;相当于listen *:8080;

# /etc/nginx/sites-available/example.com
listen     12.34.56.77:80;
listen     12.34.56.78:80;
listen     12.34.56.79:80;     

最后,最后一组的例子指示服务器侦听端口请求80的IP地址12.34.56.7712.34.56.7812.34.56.79

基于名称的虚拟主机

server_name位于server块中的指令允许管理员提供基于名称的虚拟主机。这允许从单个IP地址提供多个域。服务器根据接收到的请求报头来决定要提供哪个域(例如,当有人请求特定的URL时)。

通常,您将要为您要在服务器上托管的每个域创建一个文件。每个文件应该有自己的server块,并且该server_name指令是指定该文件影响哪个域的地方。

接下来我们将介绍一些常用的server_name指令示例:

# /etc/nginx/sites-available/example.com
server_name    example.com ;

以上示例指示nginx处理请求example.com。这是最基本的配置。

server_name    example.com  www.example.com ;

第二个例子指示服务器来处理两个请求example.com和www.example.com。

# /etc/nginx/sites-available/example.com
server_name    * .example.com ; 
server_name    .example.com ;

这两个例子是等效的。*.example.com与.example.com这两个指示服务器来处理的所有子域的请求example.com,其中包括www.example.com,foo.example.com等等。

# /etc/nginx/sites-available/example
server_name   example.*;

第四个例子指示服务器来处理所有域名请求开头example.,其中包括example.com,example.org,example.net,example.foo.com,等。

# /etc/nginx/sites-available/multi-list
server_name   example.com linode.com icann.org;

第五个示例指示服务器处理三个不同域名的请求。请注意,域名的任何组合都可以列在单个server_name指令中。

# /etc/nginx/sites-available/local
server_name    localhost  linode  galloway ;

nginx允许您为无效域名的虚拟主机指定名称。nginx使用HTTP头中的名称来回答请求; nginx无论域名是否有效。在这种情况下,可以在/ etc / hosts文件中指定主机名。

如果您的nginx服务器部署在LAN上,或者您已经知道将要求服务器的所有客户端,那么使用非域名主机名可能会很有用。这包括预配置/etc/hostsnginx正在侦听的IP地址的条目的前端代理服务器。

/etc/nginx/sites-available/catchall
server_name   "";

最后,如果设置server_name为空引号集(“”),nginx将处理所有没有主机名或具有未指定主机名的请求,例如IP地址本身的请求。

注:

个别名称与空格分开。如果需要,您可以使用正则表达式。

访问日志

access_log该指令可以在特定虚拟域中的http块中nginx.conf或块中设置server。它设置nginx访问日志的位置。通过将访问日志定义到每个server块中的不同路径,您可以将每个虚拟域的特定输出排序到其自己的文件中。块中access_log定义的指令http可用于记录对单个文件的所有访问,也可以用于访问未定义自己的日志文件的虚拟主机的全部访问。

您可以使用相对于当前目录的路径:

# /etc/nginx/nginx.conf
access_log logs/example.access.log;

或者,您可以使用完整路径:

# /etc/nginx/sites-available/example.com
access_log  /srv/www/example.com/logs/access.log ;

您也可以禁用访问日志,尽管不建议这样做:

# /etc/nginx/nginx.conf
access_log off;

Location(文件和文件夹配置)

server设置块的最后一个组件是location指令。我们将介绍的所发生的具体内部在下一节的位置块; 现在我们将专注于基本的路径设置。

该location设置允许您配置nginx如何响应服务器中的资源请求。就像server_name指令告诉nginx如何处理域的请求,例如http://example.com,该location指令涵盖了特定文件和文件夹的请求,例如http://example.com/blog/。

注:

您可以有多个位置指令。

以下是几个例子:

# /etc/nginx/sites-available/example.com
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }

前五个例子是文字字符串匹配,它匹配主机段之后的HTTP请求的任何部分。因此,例如,如果有用户请求

Request: http://example.com/

Return: 假设有一个server_name条目example.com,该location /指令将确定此请求会发生什么。

nginx始终使用最具体的匹配来满足请求。所以,例如:

Request: http://example.com/planet/blog/_或_http://example.com/planet/blog/about/

Return: 这是通过location /planet/blog/设置实现的,因为它更具体,即使location /planet/也符合此请求。

# /etc/nginx/sites-available/example.com
location ~ IndexPage\.php$ { }
location ~ ^/BlogPlanet(/|/index\.php)$ { }

当一个location指令后面跟着一个波浪号(〜)时,nginx执行正则表达式匹配。这些匹配总是区分大小写。所以,IndexPage.php将匹配上面的第一个例子,但indexpage.php不会。在第二个例子中,正则表达式^/BlogPlanet(/|index.php)$匹配的请求/BlogPlanet/和/BlogPlanet/index.php,但不是 /BlogPlanet,/blogplanet/或/blogplanet/index.php。nginx使用Perl兼容的正则表达式(PCRE)。

# /etc/nginx/sites-available/example.com
location ~* \.(pl|cgi|perl|prl)$ { }
location ~* \.(md|mdwn|txt|mkdn)$ { }

如果您希望匹配不区分大小写,请使用带有星号(〜 *)的波形符号。上面的例子指定了nginx应该如何处理以特定文件扩展名结尾的请求。在第一示例中,结束在任何文件中:.pl,.PL,.cgi,.CGI,.perl,.Perl,.prl,和.PrL(等等)将匹配的请求。

# /etc/nginx/sites-available/example.com
location ^~ /images/IndexPage/ { }
location ^~ /blog/BlogPlanet/ { }

在你的指令中添加一个插入符号和波浪号(^〜)location告诉nginx,如果它匹配一个特定的字符串,停止搜索更多的具体匹配,并使用这里的指令。除此之外,这些指令的工作方式与第一组中的文字字符串匹配一样。因此,即使稍后有更具体的匹配,如果请求与这些指令中的一个匹配,则将使用此处的设置。有关location指令处理的顺序和优先级的更多信息,请参见下文。

# /etc/nginx/sites-available/example.com
location =/ { }

最后,如果在设置中添加一个等号(=)location,这将强制与所请求的路径完全匹配,然后停止搜索更具体的匹配。例如,最终的例子将只匹配http://example.com/,而不是http://example.com/index.html。使用完全匹配可以稍微加快请求时间,如果您有一些特别受欢迎的请求,这将非常有用。

指令按以下顺序处理:

  1. 首先处理精确的字符串匹配。如果发现匹配,nginx将停止搜索并满足该请求。
  2. 接下来处理剩余的文字字符串指令。如果nginx遇到使用^〜参数的匹配项,那么它会在此处停止并满足请求。否则,nginx继续处理位置指令。
  3. 具有正则表达式(〜和〜 *)的所有位置指令都被处理。如果正则表达式与请求匹配,nginx将停止搜索并满足请求。
  4. 如果没有正则表达式匹配,则使用最具体的文字字符串匹配。 确保域下的每个文件和文件夹至少匹配一个location指令。

注:

虽然nginx的配置解析器在技术上能够读取嵌套的位置块,但这不是推荐也不支持。

位置根和索引

该location设置是另一个具有自己的参数块的变量。

一旦nginx确定哪个location指令与给定的请求最匹配,则对该请求的响应由相关location指令块的内容确定。以下是一个例子:

# /etc/nginx/sites-available/example.com
location / {
    root html;
    index index.html index.htm;
}

在此示例中,文档根位于html/目录中。给定nginx的默认安装前缀,此位置的完整路径为/etc/nginx/html/。

request: http://example.com/blog/includes/style.css return: nginx将尝试提供位于的文件/etc/nginx/html/blog/includes/style.css

注:

root如果需要,可以使用绝对路径作为指令。

index该变量告诉nginx要指定哪个文件。例如:

request: http://example.com

return: nginx将尝试提供位于的文件/etc/nginx/html/index.html。

如果为index指令指定了多个文件,nginx将按顺序处理列表,并使用存在的第一个文件来完成请求。如果index.html相关目录中不存在,index.htm则将被使用。如果不存在,将发送404消息。

这是一个更复杂的例子,它展示了一组针对服务器响应域location的nginx和Perl-FastCGI指南的指令example.com:

# /etc/nginx/sites-available/example.com location directive
location / {
    root   /srv/www/example.com/public_html;
    index  index.html index.htm;
}

location ~ \.pl$ {
    gzip off;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_index index.pl;
    fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
}

在这个例子中,在.pl扩展中结束的资源的所有请求都由第二个位置块来处理,第二个位置块指定了fastcgi这些请求的处理程序。否则,nginx使用第一个位置指令。资源位于文件系统上/srv/www/example.com/public_html/。如果请求没有指定文件名,nginx的将寻找并提供index.html或index.htm文件。如果没有index找到文件,服务器将返回404错误。

我们分析一些请求中会发生什么:

requesthttp://example.com/

return: /srv/www/example.com/public_html/index.html如果存在。如果该文件不存在,它将提供服务/srv/www/example.com/public_html/index.htm。如果不存在,nginx返回404错误。

request: http://example.com/blog/

return: /srv/www/example.com/public_html/blog/index.html如果存在。如果该文件不存在,它将提供服务/srv/www/example.com/public_html/blog/index.htm。如果不存在,nginx返回404错误。

request: http://example.com/tasks.pl

return: nginx将使用FastCGI处理程序来执行位于的文件/srv/www/example.com/public_html/tasks.pl并返回结果。

request: http://example.com/username/roster.pl

return: nginx将使用FastCGI处理程序来执行位于的文件/srv/www/example.com/public_html/username/roster.pl并返回结果。

最佳做法

前面几节的例子和解释可以帮助您学习如何配置您的nginx服务器的优雅和自信。在本节中,我们将介绍一些保持您的nginx配置的最佳实践:

  • 在可能的情况下,将配置放在单独的文件中,而不是全部在主配置文件中。
  • 为每个域单独配置文件。例如,如本指南所示,可能会调用example.com的nginx配置文件/etc/nignx/sites-available/example.com。它将包含该域的服务器块。该域名在server_name变量中指定。
  • 使用include主nginx.conf配置中的语句来包含每个服务器配置文件。这些包括语句在http { }主配置文件的块中:
# /etc/nginx/nginx.conf
http {
      # [...]

      include /srv/www/example.com/nginx.conf;

      # [...]
}
  • 以一致的模式命名文件。保持文件格式正确,格式清晰,将大大降低维护nginx服务器的负担。
https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx