在nginx配置过程中踩过的坑
nginx的主配置文件是nginx.conf,可以向该配置文件中导入其他被我们独立开来的配置文件。当配置文件被修改时,我们需要通过命令nginx -s reload让nginx服务器重新加载nginx.conf及其中包括的其他配置文件。
当遇到类似于
[]# nginx -s reload
nginx: [emerg] “server” directive is not allowed here in /etc/nginx/conf.d/hello-world.conf:1
nginx: [emerg] “location” directive is not allowed here in /etc/nginx/nginx.conf:76 nginx: configuration file /etc/nginx/nginx.conf test failed
nginx: [emerg] “usr” directive is not allowed here in /etc/nginx/conf.d/hello-world.conf:1
这样的错误,从字面意思上看,说的是server关键字不允许在配置文件中出现。当然这是不可能的,出现这种错误,多半都是因为我们在写配置文件的时候少了一个括号“{”,“}”。很多人在初次配置nginx时习惯性的去寻找自己时候在http{}或者server{}中是不是写错了什么,实则不是。
出现这种情况的另一种可能是,server关键字本身应该存在于http{}中,但是我们可能写在了http{}之外。这样,server关键字自然是不允许出现的。
测试配置文件是否出现类似于上面那样比较明显的语法错误时,可以用命令:sudo nginx -t。nginx将自动检测配置文件。
对了,如果是自己通过apt-get下载的内容,在下载之前请务必先执行apt-get update,不然可能会下到残缺版的nginx。(比如我的nginx下载下来的时候就没有nginx.pid文件(这是个重要的进程文件),在用service nginx start的时候可以看到启动成功,但是修改的配置文件并不能起到任何作用)。在修改了nginx.conf之后,也请务必使用nginx -s reload命令重新加载配置文件。(nginx能不能进行热启动,我还在探索中)。
困扰我很久的问题,终于知道原因了。Chrome和Firefox在我访问静态资源的时候,如果进行了跨域转发,会在地址最后面默认给我加个/,导致不能进入正确的地址,所以一直拿不到资源。今天突然脑子一转下了个chromium,就正常了。所以到底是浏览器bug,还是nginx配置不够安全???
当然,这也只是个例,恰好就被我一个人碰上了。