Nginx 默认项目根目录的问题

  • 先介绍下我的服务器环境以及项目的技术栈。服务器是 CentOS7.xNginx 1.16.1,服务器上部署了一个 Angular 前端项目和一个 SpringBoot 2.0 的后台项目(即前后端分离实现业务),那么自然 Nginx 中做了正向代理和反向代理
  • 下面介绍下路径,服务器上 Nginx 的路径是:/etc/nginx,该路径下还有两个目录:conf.dhtml。我的 Angular 编译后的项目存放的路径是:/projfe/wxpadfe.
  • 现在来讲下我遇到的问题。到目前为止只有一个前端项目,之后还会再追加前端项目,那么我的想法是在Nginx 中配置多个 location 以便以后可以访问多个前端项目,那么nginx.conf 的关于当前仅有的一个前端项目的 location的配置是:
        location /wxpadfe {
          alias /projfe/wxpadfe;
          index index.html;
          try_files $uri $uri/ /index.html;
        }

这种配置实际是有问题,在互联网上访问时出现了404,实际看到了上面的try_files $uri $uri/ /index.html; 已经处理了 404,多次试验后发现Nginx 是到目录:/etc/nginx/html 下寻找项目了,那么我把Angular 前端项目拷贝到这个目录下,访问正常了,那么问题来了,为什么我上面的 location 设置无效??这样的话岂不是多个前端项目同时部署会出问题了?

  • 值得一提的是,原本 Nginx 还要搜索/etc/nginx/conf.d 下的后缀是 conf 的配置文件来加载,但是我将该目录下的文件后缀修改了,目的是为了只使用一个配置文件nginx.conf,下面贴出这个配置文件的所有代码:
user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $host - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    
    server{
        listen 443 ssl;
        server_name www.xdfznh.club;
        
        ssl_certificate 1_www.我的域名.crt;
        ssl_certificate_key 2_www.我的域名.key;
        
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;
        
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        
        #root /projfe;
        
        location /wxpadfe {
          alias /projfe/wxpadfe;
          index index.html;
          try_files $uri $uri/ /index.html;
        }
        
        
        location /wxpadbe {
            proxy_pass http://127.0.0.1:7070;
        }
    }
    

    include /etc/nginx/conf.d/*.conf;
}
  • 总结,通过上面的试验推理出的逻辑的是Nginx 默认了 /etc/nginx/html 是前端项目的所在目录,并且配置文件的 location 没有生效,我要如何写配置达到我的目标?(配置文件 nginx.conf 中通过 location 布置多个前端项目)
  • 有必要的话:QQ = 409223171
阅读 10k
2 个回答

nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location

root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的...而root则可有可无~~

root实例:

location ^~ /t/ {
     root /www/root/html/;
}


location ^~ /t/ {
     root /www/root/html/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。

alias实例:

location ^~ /t/ {
 alias /www/root/html/new_t/;
}

location ^~ /t/ {
 alias /www/root/html/new_t/;
}

如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。

注意:

  1. 使用alias时,目录名后面一定要加"/"。
  2. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  3. alias只能位于location块中。(root可以不放在location中)

改用root是一种办法;
如果就是想用alias,可以指定一下root路径,而后再用alias...alias是去默认的root目录里,去搜寻alias后面的这些东西..默认的root目录需要改成你放前端项目的路径

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题