一.因为昨天做死把公司的apache换成了nginx,登陆某项目果然报500错误,现正在学习nginx..就是这样
二.nginx配置
1.初始配置
nginx 的默认配置文件位于
/etc/nginx/nginx.conf
在配置文件中有一行:
include /etc/nginx/sites-enabled/*;
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 行进行匹配的。
2.location 进阶
上面的配置只是将用户的 url 映射到本地的文件,并没有实现传说中的反向代理和负载均衡(当然 nginx 做静态文件的分发也是相当的厉害),下面我们就来进一步配置 location 看看怎么实现。location / { proxy_pass 123.34.56.67:8080; }
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; }
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来操作。