105 nginx nginx 配置

一.因为昨天做死把公司的apache换成了nginx,登陆某项目果然报500错误,现正在学习nginx..就是这样

二.nginx配置

1.初始配置

nginx 的默认配置文件位于

/etc/nginx/nginx.conf

在配置文件中有一行:

include /etc/nginx/sites-enabled/*;
这一行加载了一个外部的配置文件,sites-enabled 文件夹下只有一个 default 文件,这个外部的配置文件就是负责我们 nginx 的默认代理。将配置的内容缩水后,得到下面几行:
server {
    server_name localhost;
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

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

    location / {
    try_files $uri $uri/ =404;
    }
}
一个大型的网站通常会有很多下属的站点,有各自的服务器提供相应的服务,在 nginx 中我们可以通过一个叫虚拟主机的概念来将这些不同的服务配置隔离,这就是上面配置中的 server 的含义。举例来说 google 旗下有翻译和学术两款产品我们就可以在 nginx 的配置文件中配置两个 server,servername 分别为 translate.google.com 和 scholar.google.com,这样的话不同的 url 请求就会对应到 nginx 相应的设置,转发到不同的后端服务器上。这里的 servername 是和客户端 http 请求中的 host 行进行匹配的。
本例中 server_name 为 localhost,这就是为什么我们可以在浏览器通过 localhost 访问到页面的配置。下面两个 listen 分别对应了 ipv4 和 ipv6 下的监听端口如果设为 8080,那么我们就只能通过 localhost:8080 来访问到默认页面了。
default_server 的含义是指如果有其他 http 请求的 host 在 nginx 中不存在设置的话那么就用这个 server 的配置来处理。比如我们去访问 127.0.0.1 那么也会落到这个 server 来处理。
每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。
在这里 location 匹配 / 开始的所有请求,即 localhost 下的 /xxx 或者 /yyy 都要走下面的配置,除了这种简单粗暴的匹配,nginx 也支持正则和完全相等及其他的精细匹配方式。而 tryfiles 意思是 nginx 会按照接下来的顺序去访问文件,将第一个匹配的返回。比如你去请求 localhost/test,他会去寻找 /test 文件,找不到再去找 /test/ 再找不到就返回一个 404。此外我们还可以在 location 的配置里用 proxypass 实现反向代理和负载均衡,不过这个最简单的配置并没有涉及。
其中 root 是指将本地的一个文件夹作为所有 url 请求的根路径。比如用户请求了一个 localhost/test,那么 nginx 就会去需找 /usr/share/nginx/html 文件夹下的 test 文件返回。
而 index 就是默认的访问页面了,当我们访问 localhost 时,他会自动按顺序寻找 root 文件路径下的 index.html 和 index.htm 将第一个找到的结果返回。

2.location 进阶
上面的配置只是将用户的 url 映射到本地的文件,并没有实现传说中的反向代理和负载均衡(当然 nginx 做静态文件的分发也是相当的厉害),下面我们就来进一步配置 location 看看怎么实现。
配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8080 端口,只要这样:
location / {
    proxy_pass 123.34.56.67:8080;
}
这样所有的请求就都被反向代理到 123.34.56.67 去了。这样我们反向代理的功能是实现了,可是就能代理到一台服务器上哪有什么负载均衡呀?这就要用到 nginx 的 upstream 模块了。
upstream backend {
    ip_hash;    
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}
location / {
    proxy_pass http://backend;
}

我们在 upstream 中指定了一组机器,并将这个组命名为 backend,这样在 proxypass 中只要将请求转移到 backend 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 iphash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。
我们在 upstream 中指定了一组机器,并将这个组命名为 backend,这样在 proxypass 中只要将请求转移到 backend 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 iphash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。
 3.配置文件的结构

ngnix的配置包含了许多模块,每个模块使用指令来运行。指令包含简单指令和块指令。简单指令通过空格来分离名称和参数,使用分号(;)作为结尾;块指令和简单指令有相同的结构,但不是以分号结尾而是以大括号({})包含指令。如果一个块指令中大括号内含有其它指令,那么括号内的叫做上下文(例如:事件、http、服务器、位置)。

在配置文件中,不在任何上下文的指令被认为存在于主上下文。事件和http指令就存在于主上下文中,server在http上下文中,位置在server上下文中。

配置文件使用#号作为注释符号。

4.为静态文件提供服务

一个web服务器的重要工作就是为静态文件服务。例如,你想根据请求的不同,去不同目录去请求服务:/data/www存放html文件,/data/images存放图片信息。这就需要修改配置文件,建立一个服务器块,在这个http块中建立服务器块,服务器块内再建立两个不同的位置块。

首先,创建/data/www目录并把一个包含任意内容的index.html文件放入该目录;创建/data/images目录,放置一些图片。

然后,打开配置文件。默认配置文件中已经包含了一些server块的实例,大部分被注释掉了。现在注释掉所有的类似块,新写一个server块:

http {
    server {
    }
}

通常,配置文件可能会包含几个server块,server通常指定名称和监控端口。当nginx决定哪个server进程处理请求时,它测试uri请求报文头而不是定义在server块中的位置指令的参数。

增加下面的位置块到服务器块中:

location / {
    root /data/www;
}

位置包括中定义的“/”前缀和请求uri进行比较。如果和uri中请求匹配,uri将增加root指令的路径到uri中,亦即到本地文件系统的路径/data/www下去响应请求。如果有多个位置块匹配,nginx选择最长后缀的那个。以上的位置块提供了最短的前缀(长度为1),因此当只有所有别的位置块都不能提供匹配时,这个模块才能使用到。

接下来,增加第二个位置块:

location /images/ {
    root /data;
}

它将匹配以/images/开头的请求(位置“/”也匹配这些request,但它的前缀更短)。

上述完整的配置如下:

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

上述已经是一个可以运行的服务器的配置了,该服务器监听http标准端口80,可以通过htt://localhost/来访问本地机器。如果请求以/images/开头,那么该服务器将从目录/data/images/下获取文件来应答请求。例如:请求http://localhost/images/example.png发送后,nginx将发送/data/images/example.png文件应答请求。如果该文件不存在,nginx将发送404返回。不是以/images/开头的请求将会被映射到/data/www目录下。例如:对于请求http://localhost/some/example.html请求,nginx将会发送/data/www/some/example.html文件来应答。

为使新的配置生效,如果nginx没有启动,则启动,如果启动则发送重新加载信号到nginx主进程,执行:

nginx -s reload

若配置没有生效或者没有达到期望效果,可以通过目录/usr/local/nginx/logs或者/var/log/nginx下的access.log和error.log来查找原因。

5.建一个简单的代理服务器

nginx另一个频繁使用的特性是作为一个简单的代理服务器,代理服务器意思就是接受请求,并发送这些请求到被代理的服务器,从代理的服务器得到响应信息,然后发送给客户端。

下面介绍配置一个简单的代理服务器的例子,这个代理服务器提供从本地机器获取图片请求,然后发送到别的其它的被代理服务器。在这个例子中,所有的服务器都定义在一个单独nginx实例。

首先,定义被代理服务器,这可以通过在配置文件中增加一个或者多个服务器块,具体内容如下:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这个简单的服务器监听端口8080(上个例子中没有使用listen是因为使用http标准端口80),映射所有的请求到本地文件系统的/data/up1目录,创建此目录并放置index.html文件到该目录。注意root指令被放置到服务器上下文。当选择提供服务的位置块不包含自己的root指令时该root指令将被使用。

接下来,使用上篇服务器的配置并修改,使之成为一个代理服务器的配置。在第一个位置块中,在第一行的参数中添加proxy_pass指令加代理服务器的协议、名称、端口。(在我们的例子中是http://localhost:8080):

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

我们将修改第二个位置块的配置,以前是映射/image/前缀的请求到/data/images/目录下的文件,为了和典型图片的文件扩展名相匹配,修改的位置块配置文件如下:

location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

这个参数是一个正则表达式,它匹配以.gif,.jpg或者.png结尾的url。一个正则表达式应该以~开头。响应的请求将被映射到/data/images目录。

当nginx选择一个位置块为请求提供服务时,它首先检测指定带前缀的位置指令,别忘记优先选择最长前缀的,再检测正则表达式。如果和一个正则表达式匹配,nginx选择这个位置块,否则选择最初的那个。

完整的代理服务器配置如下:

server {
    location / {
        proxy_pass http://localhost:8080/;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

这个服务器将过滤以以.gif,.jpg或者.png结尾的请求,然后映射到目录/data/images 下(通过增加url到root指令参数),转发其它请求到配置的被代理服务器中。

6.建立FashCGI代理

nginx可以用来追踪到FastCGI 服务器上的请求,FastCGI服务器可以运行不同框架不同编程语言(例如php)构建的应用程序。

适用FastCGI服务器运行的nginx最基本配置包括:

使用fastcgi_pass指令而非proxy_pass;

fastcgi_param指令设置发送参数到Fastcgi服务器。

假定可以通过http://localhost:9000来访问FastCGI服务器。

替换proxy_pass指令为fastcgi_pass指令并改变参数到localhost:9000.对于PHP,SCRIPT_FILENAME参数用来决定脚本名称,QUERY_STRING参数用来传送请求参数,完整配置如下:

 

server {
    location / {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING    $query_string;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
} 

这将建立一个服务器,该服务器追踪到被代理的服务器的所有请求(静态图片除外),这个服务器使用FastCGI协议通过localhost:9000来操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值