Nginx 虚拟主机配置与请求处理原理
安装
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.comNginx寻找:
server_name www.test.com;匹配成功后进入这个server。
4.root(网站根目录)
root /data/www;作用:指定静态文件存放位置
例如:
目录:
/data/www
|
└── index.html请求:
http://www.test.com/index.htmlNginx实际寻找:
/data/www/index.html5.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.phpNginx会去找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目录 + URI3.转发给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/userNginx:
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.jpgNginx会:
把:
/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