其实是很简单的设置,但由于不懂docker,走了许多弯路。

一、虚拟目录设置规则无效

我想将一些静态资源部署到测试服务器上,方便开发和演示。测试服务器是阿里云虚拟机,linux,上面装有有一个nginx,可以完成这个小凯丝。结果自认为对nginx已经有了一定了解,这种简单任务手到擒来,不料搞到鸡毛鸭血。配置好虚拟目录的映射后,系统死活不认,无法访问,自动跳到登录页面。摘录配置如下:

server {
	listen      80;
	server_name 192.168.0.248;

	location / {
     	root /home/admin_ui/dist;
     	index /mscodereact/index.html;
     	try_files $uri $uri/ /mscodereact/index.html;
	}

	location /favicon.ico {
     	root /home/admin_ui/dist;
   		try_files $uri/ /mscodereact/favicon.ico;
	}

	#这就是我想添加的虚拟目录
	#请注意其路径与 “/”指向的路径并不相同
	location /javapubzy/ {
		index index.html;
 		alias /home/beian/javapubzy/;
     	try_files $uri $uri/ /javapubzy/index.html;
	}
}

在网上查找来,查找去,访问这个http://192.168.0.248/javapubzy,都是跳到了登录页面。究其原因,是因为系统路径指向无效,于是做了默认处理,采用了第一条设置规则:

	location / {
     	root /home/admin_ui/dist;
     	index /mscodereact/index.html;
     	try_files $uri $uri/ /mscodereact/index.html;
	}

其中,try_files $uri $uri/ /mscodereact/index.html;,意思是,系统先看有没有$uri这个文件,没有则看有没有$uri这个文件夹(即$uri/,后面的斜杠代表文件夹)。如果没有,则跳到/mscodereact/index.html,这是一个应用的首页,需要登录。

二、规则无效的原因是路径无法访问

	#这就是我想添加的虚拟目录
	#请注意其路径与 “/”指向的路径并不相同
	location /javapubzy/ {
		index index.html;
 		alias /home/beian/javapubzy/;
     	try_files $uri $uri/ /javapubzy/index.html;
	}

经过反复测试,发现将文件夹移到根目录"/"所在的位置,即可正常访问,放到别的地方就不行。想起之前同事的提示,醒悟过来。我猜测,这个nginx是装在docker里的,安装的时候,只映射了一个特定的文件夹,只有将内容放在其中,才有可能识别。

改为

location /javapubzy/ {
	index index.html;
    alias /home/admin_ui/dist/javapubzy/;
    try_files $uri $uri/ /javapubzy/index.html;
}

其实这一步纯属多余。将文件夹javapubzy放置到指定的根目录后,无须做任何设置,即可访问。即使设置了,也不生效。如:

location /j/ {
	index index.html;
    alias /home/admin_ui/dist/javapubzy/;
    try_files $uri $uri/ /j/index.html;
}

在这里,想用j来代替javapubzy,反而无法访问,纯属画蛇添足。

由于我目前在docker里如何安装nginx并不了解,所以无法扯更多,可参考如下文章:
docker中nginx的默认路径位置和映射目录启动

三、虚拟目录设置规则解释

	location / {
     	root /home/admin_ui/dist;
     	index /mscodereact/index.html;
     	try_files $uri $uri/ /mscodereact/index.html;
	}

	location /favicon.ico {
     	root /home/admin_ui/dist;
   		try_files $uri/ /mscodereact/favicon.ico;
	}

	location /javapubzy/ {
		index index.html;
 		alias /home/admin_ui/dist/javapubzy/;
     	try_files $uri $uri/ /javapubzy/index.html;
	}

这3个规则放在一起,结合起来看利于比较。可以发现映射路径有 root 和 alias 两种方式。

1、root与alias的区别
1)root指向虚拟目录所在的父文件夹,而alias直接指向虚拟目录所在文件夹

2)同一个虚拟路径,如果既设置了root方式,又设置了alias方式,则以alias方式为准

2、默认页面

index index.html;

不要用下面这个,这个是列出目录下的文件,不安全。

autoindex on;

3、try_files

try_files $uri $uri/ /javapubzy/index.html;

系统先看有没有$uri这个文件,没有则看有没有$uri这个文件夹(即$uri/,后面的斜杠代表文件夹)。如果没有,则跳到/javapubzy/index.html

四、其他一些干扰问题

1、nginx里面,http和https是分开设置的。因此映射虚拟目录的话,要分别设置

2、设置完nginx后,利用浏览器测试结果,最好清一下浏览器缓存,否则很可能看不到效果,导致以为设置无效,让人迷惑

Logo

更多推荐