Linux:小老弟, 还得给你上一课!

乐活   2024-11-26 15:06   四川  


我的个人博客:www.moonkite.cn

各位好,我是风筝

事情是这样的,周末写好了一个网站准备部署上线,正好之前有一个小程序半死不活的,就准备直接放到那台服务器上。

正好 Nginx 之前就创建好的,版本还挺新的,是 Nginx 1.26。之前用 Nginx 只是为后端服务提供反向代理的,这次要部署的是一个从 Nextjs build 来的纯前端。

先把之前的配置删掉了,然后把前端资源放到一个目录下,准备配置一下看看线上效果。听说 Nextjs 做 self host 部署好像有坑,想马上验证一下。

用 vi 打开配置nginx配置文件,在其中加入了下面几行配置:

server {
listen 80;
server_name xxx.com;

access_log /var/log/nginx/host.access.log main;
root /xxx/xxx;
index index.html index.htm;
}

然后优雅的用 systemctl restart nginx重启服务,心里想着,如果 Nextjs 没给我挖坑就谢天谢地了。

结果一访问,哼哼,Nginx,果然没让我失望。扎眼的 403 Forbidden就在那儿明晃晃的出现了,病急乱投医,把域名改成IP也没变化。

不用说了,谜底就在谜面上,权限问题,打开 nginx 错误日志,果不其然,Permission denied,权限问题。

此时我嘴角露出狡黠的微笑,就这是吧。

没错,目录确实是新建的,而且是用 root 用户创建的,而 Nginx 服务默认使用 nginx 这个用户启动的,所以没有权限也是有可能的。可以在配置文件中看到当前 nginx 的启动用户,一般就在配置文件的第一行。

也可已通过以下命令查看正在运行的 nginx 进程的运行用户,会输出 master 和 worker 进程的用户。

ps aux | grep nginx

反正是权限问题,直接一顿输出。

sudo chown -R nginx:nginx /xxx/xxx
sudo chmod -R 755 /xxx/xxx

把 Nextjs build 之后的目录的所有者指定给 nginx 用户,然后赋予 755 权限,表示目录可读、可写、可执行,文件可读和可执行(仅限拥有者)。

其实可以通过 ls -l /xxx/xxx 查看目录的权限设置情况,如果权限设置的没问题就不用改了。

例如查看后的输出如下:

-rw-r--r-- 1 root root 4096 Nov 25 14:00 index.html

表示文件所有者(root)有读写权限,所属组和其他用户只有读取权限,默认情况下就是这样的,这其实就够了。

罪魁祸首原来是 SELinux

其实看到这里大家应该发现,默认情况下其他用户就已经对文件有读取权限了,nginx 当然属于其他用户了。

当时我也没有管(做技术必须要有一股冲劲,别管有没有,往前冲就完了[狗头]),直接就给赋予了755权限。

但是当我设置完成后,然后再次重启 nginx 后。

我才发现问题没有我想得那么简单,竟然没作用,还是 403 。然后我试了停止再启动 nginx、将nginx启动用户改为 root、将目录权限直接设置为 777,没用,都没用。

此时,我已经陷入自我怀疑,还是 Linux 知识不够啊。

后来终于在我不折不挠的一顿 Google 和 GPT 之后,发现了罪魁祸首。

就是 SELinux 这玩意儿,以前怎么没碰到过呢,我怀疑是云服务给我偷偷升级开启这个策略了,要不然以前怎么没碰到过。好吧, 其实还是孤陋寡闻了。

SELinux(Security-Enhanced Linux)是一种强制访问控制(MAC)的安全机制,旨在增强 Linux 系统的安全性。它通过为文件、进程和网络资源设置安全上下文,严格控制每个进程可以访问哪些资源,从而提供额外的安全保护。

SELinux 是一种更细粒度的权限控制,可以控制每个进程能访问哪些资源。

通过命令 getenforce可以看到当前服务器是否开启了 SELinux 策略。有以下三种模式

1、Enforcing:强制模式。 2、Permissive:宽容模式,仅记录日志。 3、Disabled:已禁用。

我输入命令一看,果然是 Enforcing 强制启动模式,也就是说,虽然nginx有权限查看文件,但是nginx下的某些进程还是没权限。

要解决这个问题的方式有两个,第一就是禁用掉它,第二个就是想办法给 nginx 下的某些进程增加对应的权限。

通过在 /etc/selinux/config文件中增加如下配置可以禁用掉SELinux

SELINUX=disabled

但是,既然服务器给打开了,咱就尊重它,采用第二种方式,让nginx访问文件时有权限。

使用一下命令可以解决这个问题,将静态文件目录及其所有文件的 SELinux 上下文类型设置为 httpd_sys_content_t,用于 Web 服务器可以访问这些文件,这时候,nginx 就可以正常读取这些文件了。

chcon -R -t httpd_sys_content_t /xxx/xxx

修改完成后,重启 nginx。完美,一切正常了,谢天谢地,Nextjs 也没给挖坑。

最后

做技术就是这样,总会时不时给你来点儿惊喜,虽然用 Linux 好多年,也执行过好多命令,配置过不少次 nginx以及其他服务,但是经常碰到一些让你措手不及的问题,时刻提醒你:“兄弟,还得练啊!”。

我觉得把 AI 用到安装配置这些软件上来最合适不过了,只nginx这一个软件,安装、配置、问题收集我就写了很长的笔记,但是每次重新安装都得照着文档来一遍,永远记不住。AI一键安装,输入prompt实现定制配置,什么时候有这样的AI助手出来呢。


还可以看看风筝往期文章

程序员如何设计logo,如何找Icon和插画(绝对干货)

用这个方法,免费、无限期使用 SSL(HTTPS)证书,从此实现证书自由了

为什么我每天都记笔记,主要是因为我用的这个笔记软件太强大了,强烈建议你也用起来

「差生文具多系列」最好看的编程字体

我患上了空指针后遗症

一千个微服务之死

搭建静态网站竟然有这么多方案,而且还如此简单

被人说 Lambda 代码像屎山,那是没用下面这三个方法

古时的风筝,一个程序员,一个写作者。

古时的风筝
努力成为独立开发者的程序员,分享我了解的关于编程、独立开发等知识,知不不言,言无不尽
 最新文章