安装

YUM安装

yum -y install nginx
systemctl start nginx && systemctl enable nginx

编译安装

# 准备编译环境
yum -y install gcc pcre-devel openssl-devel zlib-devel
# 源码包
wget http://nginx.org/download/nginx-1.22.0.tar.gz -P /usr/local/src/

Nginx如何接受请求并根据规则处理请求?

虚拟主机

虚拟主机就是在一台物理服务器上,通过Nginx配置多个“网站服务器”

一台机器:
192.168.133.130

安装一个Nginx

可以同时运行

www.baidu-test.com
blog.test.com
shop.test.com

三个网站

用户访问不同域名时,Nginx根据规则把请求分别发到不同的网站配置。

现实中购买了一台云服务器

公网IP:
1.2.3.4

若不使用虚拟主机

则此公网通过nginx只可运行一个网站,很浪费。

但使用虚拟主机

             nginx
               |
   ---------------------------
   |            |            |
 blog.com   shop.com    api.com
   |            |            |
博客程序    商城程序     后端接口

一台服务器托管多个业务。

为什么叫“虚拟”?

因为它不是实际存在的服务器,比如你只有:

一台Linux服务器
一个Nginx进程
一个80端口

但通过配置:

server {
    server_name blog.test.com;
}

server {
    server_name shop.test.com;
}

就能让用户感觉像访问两个不同服务器。

Nginx虚拟主机靠什么区分?

1.域名

例如:

server {
    listen 80;
    server_name blog.test.com;

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


server {
    listen 80;
    server_name shop.test.com;

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

访问blog.test.com,将进入/data/blog

访问shop.test.com,将进入/data/shop

2.端口

例如:

server {
    listen 80;

    location / {
        root /data/web1;
    }
}


server {
    listen 8080;

    location / {
        root /data/web2;
    }
}

访问http://IP:80进入一个网站

访问http://IP:8080进入另一个网站

3.IP地址

例如:

服务器有两个IP:

192.168.1.10
192.168.1.20

配置:

server {
    listen 192.168.1.10:80;
}


server {
    listen 192.168.1.20:80;
}

Nginx中的虚拟主机对应什么配置?

核心即为:

server {}

一个server {}就是一个虚拟主机

例如:

server {

    listen 80;

    server_name www.test.com;


    location / {

        root /code/www;

        index index.html;

    }

}

这一整个块就是一个虚拟主机。

虚拟主机有什么作用?

1.一台服务器部署多个网站

2.不同域名对应不同业务

3.实现反向代理入口

一个完整的虚拟主机(server块)配置

server {

    listen 80;

    server_name www.test.com;

    root /data/www;

    index index.html index.php;


    location / {

        ...

    }


    access_log /var/log/nginx/www_access.log;

    error_log /var/log/nginx/www_error.log;

}

1.server块(虚拟主机主体)

server{

}

这是虚拟主机的边界

一个server{}代表一个虚拟主机

nginx收到请求后,会在所有的server中选择一个进行处理

2.listen(监听地址和端口)

listen 80;

作用:定义这个虚拟主机监听哪个端口

此处表示监听HTTP 80端口

listen 8080;则表示监听8080端口

还可以指定IP:

listen 192.168.133.130:80;

表示:只监听这个IP的80端口。

3.server_name(域名匹配)

server_name www.test.com;

作用:

根据HTTP请求中的Host字段匹配虚拟主机。

例如用户访问:

http://www.test.com

浏览器发送:

Host: www.test.com

Nginx寻找:

server_name www.test.com;

匹配成功后进入这个server。

4.root(网站根目录)

root /data/www;

作用:指定静态文件存放位置

例如:

目录:

/data/www
    |
    └── index.html

请求:

http://www.test.com/index.html

Nginx实际寻找:

/data/www/index.html

5.index(默认首页)

index index.html index.php;

作用:指定访问目录时默认打开的文件。

例如访问:

http://www.test.com/

配置

server {

    listen 80;
    server_name www.test.com;

    root /data/www;

    index index.html index.php;

}

Nginx会依次寻找:

index.html
index.php

Nginx会去找root指定的目录/data/www,然后查看index配置

如果/data/www/index.html存在,nginx就读取这个文件的内容然后返回给浏览器。

如果/data/www/index.html不存在,nginx就继续找/data/www/index.php,如果存在nginx就会继续判断这个文件是不是要交给PHP处理,如果有:

location ~ \.php$ {

    fastcgi_pass 127.0.0.1:9000;

}

那么:

index.php
   |
   |
 PHP-FPM
   |
执行PHP代码
   |
生成HTML
   |
返回浏览器

如果两个都不存在

像:

/data/www/
    a.html
    b.html

没有index.html和index.php

那么默认返回

404 Forbidden

或者根据配置可能显示目录列表(autoindex开启时)。

index不是文件,而是一组“默认首页候选名单”,Nginx按照配置顺序逐个寻找,找到第一个存在的文件后停止。

6.location(请求匹配规则)

这是虚拟主机中最重要的部分

location负责根据用户请求的URI,决定如何处理这个请求。

URI是什么?

请求路径

比如用户访问:

http://www.test.com/images/a.jpg

其中

/images/a.jpg

就是URI

Nginx收到请求后:

第一步:

server匹配:

Host: www.test.com            #Host请求头

找到:

server_name www.test.com;

第二步:

location匹配:

看URI:

/images/a.jpg

应该交给哪个location。

匹配到请求后,Nginx下一步干什么?

格式:

location 匹配规则 {

        处理方式

}

常见:

1.返回静态文件

配置:

location / {

    root /data/www;

}

意思是所有请求/进入这里

2.精确处理某类文件

例如:

location ~ \.jpg$ {

    root /data/images;

}

意思:

如果URL结尾是:

.jpg

进入这里。

访问:

/test.jpg

寻找:

/data/images/test.jpg

返回图片。

公式:

root目录 + URI

3.转发给PHP

例如:

location ~ \.php$ {

    fastcgi_pass 127.0.0.1:9000;

}

意思:

请求:

index.php

不要Nginx自己处理。

交给:

PHP-FPM

流程:

用户
 |
index.php
 |
Nginx
 |
fastcgi_pass
 |
PHP-FPM
 |
执行代码
 |
返回结果

4.反向代理

例如:

location / {

    proxy_pass http://backend;

}

意思:

请求不要本机处理。

转发给后端。

例如:

用户:

GET /api/user

Nginx:

proxy_pass http://backend

变成:

GET /api/user

↓

后端服务器

流程:

用户
 |
Nginx
 |
proxy_pass
 |
后端应用
 |
返回数据
 |
Nginx转给用户

5.直接返回内容

如echo模块:

location /main {

    echo "hello";

}

访问:

/main

直接返回:

hello

请求处理流程一条线

客户端请求
      |
      ↓
HTTP请求中的Host
      |
      ↓
server_name匹配虚拟主机
      |
      ↓
URI匹配location
      |
      ↓
location决定处理方式
      |
      ↓
静态文件 / PHP / 代理 / 返回内容
      |
      ↓
响应客户端

Alias

location负责匹配请求,alias负责修改请求对应的文件路径。

location:决定“这个请求交给谁处理”

alias:决定“去哪个真实目录找文件”

location通过root + URI拼接路径得到指定文件位置

而alias不是拼接,而是替换

例如:

location /images/ {

    alias /data/pictures/;

}

访问:

http://www.test.com/images/a.jpg

Nginx会:

把:

/images/

替换成:

/data/pictures/

最终找:

/data/pictures/a.jpg

关系:

请求:
/images/a.jpg


alias替换:


/data/pictures/a.jpg

日志配置

生产排障必须。

访问日志:

/var/log/nginx/access.log

错误日志:

/var/log/nginx/error.log

重点:

tail -f access.log

看:

  • 状态码
  • IP
  • URL
  • User-Agent

标签: none

添加新评论