安装
安装依赖
在Linux中是编译安装,所以要准备一系列工具
yum install pcre-devel make gcc gcc-c++ ncurses-devel perl zlib zlib-devel openssl openssl-devel
工具目的 | 程序 |
---|---|
编译器 | make gcc gcc-c++ |
安全协议 | openssl openssl-devel |
语言 | perl脚本语言 |
正则表达式库 | pcre-devel(用于perl语言) |
压缩库 | zlib zlib-devel |
字符处理库 | ncurses-devel |
cd /usr/local/
wget http://nginx.org/download/nginx-1.10.1.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1
执行Configuration配置检查文件,指定目录到刚刚新建的nginx目录里
./configure --prefix=/usr/local/nginx
执行make操作和make install进行安装
make
make install
安装完成后,将nginx命令移动到$PATH的目录下,这样就不用每次都cd到 /usr/local/sbin 里去运行了
mv /usr/local/nginx/sbin/nginx /usr/local/bin/
然后使用nginx -c 命令指定配置文件,接着使用 nginx -t 命令检查配置文件是否正确,得到反馈syntax is ok
nginx -c /usr/local/nginx/conf/nginx.conf
nginx -t
启动:
nginx
重启:
nginx -s reload
立即停止:
nginx –s stop
温和停止:
nginx -s quit
强制关闭:
pkill nginx
打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
配置
Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值。
- HTTP
HTTP代表在该计算机上启动HTTP路由,可以开启不同的server服务,所以HTTP内可以包括多个server。
http {
server {
# 在80端口监听http服务
# 正常情况下会和个人电脑的浏览器冲突,但是服务器上一般没浏览器
# 因为浏览器之所以能上网,就是在80端口不停的监听http服务
listen 80;
server_name localhost;
......
}
server {
# 在8080端口监听http服务
listen 8080;
server_name localhost;
......
}
......
}
- Server
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。
server {
listen 80;
server_name host1;
root html;
index index.html index.htm;
}
server {
listen 80;
server_name host2;
root /data/www/html;
index index.html index.htm;
}
这里的 listen 指监听端口,server_name 用来指定IP或域名,多个域名对应统一规则可以空格分开,index 用于设定访问的默认首页地址,root 指令用于指定虚拟主机的网页跟目录,这个地方可以是相对地址也可以是绝对地址。
但是当 server 超过2个时,建议将不同对虚拟主机的配置放在另一个文件中,然后通过在主配置文件 nginx.conf 加上 include 指令包含进来。更便于管理。
include vhosts/*.conf;
由于DNS的存在,我们可以使用一个IP对应多个域名,比如 www.a.com 和 www.b.com 这个称之为host,后边的才是路径path,Nginx会对HTTP的Request报文做如下处理。
POST /psas/bug/image/confirm HTTP/1.1 <== 第一行才是path
Accept: application/json
Content-Type: text/plain; charset=utf-8
Cookie: JSESSIONID=h72ql6a
Host: www.a.com:8080 <== 这一行是host
Connection: close
User-Agent: Paw/3.0.12 (Macintosh; OS X/10.12.0) GCDHTTPRequest
Content-Length: 366
接收到请求后去HTTP报文头拿host字段。
去和server name字段进行匹配,哪个匹配上用哪个处理。
如果没有匹配上,就用listen了当前端口的默认server处理。
默认server可以自己设置,如果没有设置,默认配置文件中最靠前是默认。
- Location
每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。如果有多个匹配的location块,则nginx选择最长前缀的那个。/的location块的前缀只有一个字符,是最短的,因此只有当其它location都匹配失败时,这个location才会被选择。
匹配例子:
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
请求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
具体可参考:Location配置详细
服务静态内容:
web服务器的一个重要任务是对外输出文件,比如图片和静态网页。你会实现一个这样的例子:根据不同的请求,文件会从不同的本地目录,如: /data/www (html) 和 /data/images 被输出。这需要修改配置文件并且在http块指令中建立带有两个location块的server块。
首先,创建/data/www的目录并且放置一个index.html的文件,然后创建/data/images目录并放置一些图片
下面的例子中它会匹配以/images/开始的请求(location / 也会匹配这个请求,但它的前缀更短) 。如,server块指令看起来就像这样
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这个配置已经可以工作了,它监听在标准的80端口上,并且可以在本机上通过http://localhost/ 访问。为了响应以/images/开头的URI,服务器会从/data/images目录中发送文件。比如:为了响应http://localhost/images/example.png ,nginx会发送/data/images/example.png这个文件,如果不存在这样的文件,nginx就会发送404错误。而不以/images/开头的请求则被映射到/data/www目录,比如:http://localhost/some/example.html 被映射到/data/www/some/example.html文件。
建立简单的代理服务器:
nginx一个最常见的用途就是用作代理服务器,也就是把收到的请求传递给被代理的服务器,并从被代理服务器中取回响应,再将其发送给客户端。
我们会配置一个基本的代理服务器,对于图片文件的请求,从本地目录中发送文件,而对于其它的请求,则把请求转发给另一个被代理服务器。在这个例子里,两个服务器都会在一个单一的nginx实例中被定义。
首先,通过添加一个块指令定义一个被代理服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个监听在8080端口的简单服务器(之前我们定义的server块不声明listen指令是因为使用了标准的80端口)并且会把所有请求映射到本地的 /data/upl 文件夹。创建这个文件夹并且放入一个index.html文件。注意,这里的root指令被放在了server上下文中。当有一个location被选择了而它的内部却没有root指令时,它就会使用server中的这个root指令。
接下来,修改在前一节中的server配置使它变为一个代理服务器的配置。在第一个location块中,添加proxy_pass指令,它的参数是被代理服务器的协议,名称和端口。(本例中,参数是 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们现在修改第二个location块,使它由原先的匹配/images/前缀变为匹配典型的图片文件扩展名。修改后的location如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个匹配所有以.gif,.jpg或.png结尾的URI的正则表达式。~ 应该被写在正则表达式前面。
当nginx选择一个location时,它先检查前缀,并且记录匹配的location(最长前缀),然后nginx再检查正则表达式,如果有一个正则表达式匹配,它就选择这个location,否则,选择之前记录的location。
最终的代理服务器配置:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
现在,这个服务器可以将以.gif,.jpg或.png结尾的请求映射到本机目录,将其它所有请求发送到被代理服务器。为了使配置生效,要发送reload信号。