Nginx 虚拟主机
虚拟主机作用
虚拟主机提供了在同一台服务器上运行多个网站的功能。
虚拟主机的三种模式
- 基于多域名方式配置虚拟主机
- 基于多端口配置虚拟主机
- 基于多 ip 配置虚拟主机
基于多域名的虚拟主机是最常见的一种虚拟主机。
只需配置你的 DNS 服务器,将每个主机名映射到正确的 IP 地址,然后配置 Nginx 服务器,令其识别不同的主机名就可以了。
网域名称系统(DNS,Domain Name System,将域名和IP地址相互映射的一个分布式数据库)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
参考:
https://baike.baidu.com/item/%E5%9F%9F%E5%90%8D/86062?fr=aladdin
基于多端口的虚拟主机,可以使用同一个 ip,通过访问不同的端口来访问。
基于多 IP 的虚拟主机可以通过添加多个网卡或者在一块物理网卡上绑定多个 IP 地址来实现
ps:如果没有特殊要求,最好还是使用基于多域名的虚拟主机。
多域名配置虚拟主机
配置 hosts 文件
hosts 文件:在本机计算机上面,配置本地的 ip 地址和域名映射关系,通常用于测试。
- Windows 本地 hosts 文件
C:\Windows\System32\drivers\etc\hosts
192.168.115.129 www.xiaobei.com
- Linux 本地 hosts 文件
vim /etc/hosts
192.168.115.129 www.xiaobei.com
创建虚拟主机配置文件
#在http指定块中添加:
include /usr/local/nginx/conf/vhost/*.conf;
#创建配置主机配置文件
mkdir -p /usr/local/nginx/conf/vhost
vim /usr/local/nginx/conf/vhost/www.xiaobei.com.conf
server {
listen 80;
server_name www.xiaobei.com;
location / {
root /usr/local/nginx/html/xiaobei;
index index.html index.htm;
}
}
vim /usr/local/nginx/conf/vhost/www.xb.com.conf
server {
listen 80;
server_name www.xb.com;
location / {
root /usr/local/nginx/html/xb;
index index.html index.htm;
}
}
多端口配置虚拟主机
server {
listen 8080;
server_name www.xiaobei.com;
location / {
root /usr/share/nginx/html/xiaobei;
index index.html;
}
}
多 IP 配置虚拟主机
cp /etc/sysconfig/network-scripts/ifcfg-ens32{,:1}
vim /etc/sysconfig/network-scripts/ifcfg-ens32:1
#修改以下信息:
NAME="ens32:1"
DEVICE="ens32:1"
IPADDR=192.168.115.129
# 重启服务:
systemctl restart network
server {
listen 192.168.115.129:80;
server_name www.xiaobei.com;
location / {
root /usr/share/nginx/html/xiaobei;
index index.html;
}
}
#重启nginx服务:
systemctl restart nginx
Nginx 反向代理
反向代理概念
反向代理是 nginx 的一个重要功能,在编译安装时会默认编译该模块。在配置文件中主要配置 proxy_pass 指令。
代理服务器接受客户端的请求,然后把请求代理给后端真实服务器进行处理,然后再将服务器的响应结果返给客户端。
反向代理作用
与正向代理(正向代理主要是代理客户端的请求)相反,反向代理主要是代理服务器返回的数据,所以它的作用主要有以下两点:
- 可以防止内部服务器被恶意攻击(内部服务器对客户端不可见)。
- 为负载均衡和动静分离提供技术支持。
反向代理语法
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
代理服务器的协议,可支持 http 与 https。 地址可以指定为域名或 IP 地址,以及可选端口。
例如:
proxy_pass http://192.168.115.129;
proxy_pass http://192.168.115.129:8080;
proxy_pass http://localhost:9000/uri/;
实例一
location 和 proxy_pass 都不带 uri 路径。
代理服务器:192.168.115.129 后端服务器:192.168.115.132
#代理服务器的简单配置:
location / {
proxy_pass http://192.168.115.129;
}
# proxy_pass 转发请求给后端服务器
#后端服务器的配置:
location / {
echo $host;
root html;
index index.html index.htm;
}
# echo $host 这个主要是来看下后端接收到的Host是什么。
验证
[root@localhost ~]# curl 192.168.115.129
192.168.115.132
# 获取的请求Host是后端服务器ip,去掉该指令,验证请求结果。
[root@localhost ~]# curl 192.168.115.129
this is 132 page
# 可以看到我们访问的是129,但是得到的结果是132的发布目录文件。
实例二
proxy_pass 没有设置 uri 路径,但是代理服务器的 location 有 uri,那么代理服务器将把客户端请求的地址传递给后端服务器。
# 代理服务器的配置:
location /document/data/ {
proxy_pass http://192.168.115.132;
}
# 后端服务器的配置:
location / {
# echo $host;
root html/uri;
index index.html index.htm;
}
验证
[root@localhost ~]# mkdir -p /usr/local/nginx/html/uri/document/data/
[root@localhost ~]# echo "this is /usr/local/nginx/html/uri/document/data/ test" > /usr/local/nginx/html/uri/document/data/index.html
[root@localhost ~]# curl 192.168.115.129/document/data/
this is /usr/local/nginx/html/uri/document/data/ test
# 完整请求路径 是在后端服务器的/usr/local/nginx/html/uri 后追加客户端请求的路径 /document/data/
实例三
如果proxy_pass 设置了 uri 路径,则需要注意,此时,proxy_pass 指令所指定的 uri 会覆盖 location 的 uri。
# 代理服务器的配置:
location / {
proxy_pass http://192.168.0.114/data/;
}
# 后端服务器的配置:
location / {
root html;
index index.html index.htm;
}
验证
[root@localhost ~]# mkdir -p /usr/local/nginx/html/data/
[root@localhost ~]# echo "this is /usr/local/nginx/html/data test。" > /usr/local/nginx/html/data/index.html
[root@localhost ~]# curl 192.168.0.109
this is /usr/local/nginx/html/data test。
#这样看好像很正常,但是稍作修改。
这次加上 location 的 uri,后端服务器加个子目录:
# 代理服务器的配置:
location /document/ {
proxy_pass http://192.168.0.114/data/;
}
# 后端服务器的配置:
location / {
#echo $host;
root html;
index index.html index.htm;
}
再次验证
[root@localhost ~]# curl 192.168.115.129/document/
this is /usr/local/nginx/html/data test。
# 该路径还是 proxy_pass 指定的uri路径,与location 没有关系了!
获取远程客户端真实 ip 地址
# 代理服务器配置:
location / {
proxy_pass http://192.168.0.114;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
}
# 后端服务器配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent
"$http_referer" '
'"$http_user_agent"
"$http_x_real_ip" "$http_x_forwarded_for"';
access_log logs/access.log main;
缓存代理服务器实战
在代理服务器的磁盘中保存请求目标的内容,加快响应速度,减少应用服务器(后端服务器)上的资源开销,比如多客户端请求相同的资源,代理缓存命中后,对于应用服务器来说,只发生了一次资源调度。
而浏览器上的缓存配置,一般来说是用来减少本地 IO 的,请求目标的内容会存放在浏览器本地。
# 代理服务器配置:
proxy_cache_path /data/nginx/cache max_size=10g
levels=1:2 keys_zone=nginx_cache:10m inactive=10m
use_temp_path=off;
upstream nginx {
server 192.168.0.114;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://nginx;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache nginx_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 1d;
}
}
/data/nginx/cache #缓存资源存放路径
levels #设置缓存资源的递归级别,默认为levels=1:2,表示Nginx为将要缓存的资源生成的key从后依次设置两级保存。
key_zone #在共享内存中设置一块存储区域来存放缓存的key和metadata,这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
max_size #最大cache空间,如果不指定,会使用掉所有diskspace,当达到配额后,会删除不活跃的cache文件
inactive #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
use_temp_path #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
proxy_cache #启用proxy cache,并指定key_zone。如果proxy_cache off表示关闭掉缓存。