SELinux是个大坑!
说在前面,本次折腾最大的绊脚石就是SELinux
这个逼养的玩意,这玩意权限控制是自己一套的,例如,就算你给了Samba读写的目录777
的权限,也一样会Permission Denied
,如果是新手不知道的话,很容易在配置过程中红温。SELinux我肏你妈!!!但是,实际上SELinux可以给系统一套额外的安全防护,对于注重安全的用户来说还是很有必要的。所有,如果遇到了奇奇怪怪的Permission Denied
,不妨试试看关掉SELinux
,看看服务是否可以正常运行了。如果可以运行了,就设置SELinux
的规则就好了。
部署Nginx服务
安装Nginx
yum install nginx
配置Nginx配置文件
根据MCSManager的官方文档精神,需要创建一个Nginx配置文件来实现反向代理并加入TLS以实现Https。
创建一个配置文件,位于:/etc/nginx/conf.d/
,名字可以自己取。例如:
nano /etc/nginx/conf.d/mcsm-proxy.conf
然后填入以下内容:
# MCSM面板端开启HTTPS反向代理
server
{
# 面板端公网HTTPS端口(可用多个listen监听多个端口)
listen 2333 ssl http2; #IPV4
listen [::]:2333 ssl http2; #IPv6
# 开启HSTS 开启后将强制使用HTTPS连接面板并在取消此策略后持续一年除非在浏览器手动清除策略。
# 默认未开启,可取消注释开启.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# DNS服务器,仅在目标面板需要使用域名连接时需要。
resolver 8.8.8.8;
# 自动重定向HTTP连接至HTTPS
error_page 497 https://$host:$server_port$request_uri;
proxy_hide_header Upgrade;
location / {
# 请求头 一般无需更改
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
#目标面板的地址与端口。支持使用域名及https连接。
proxy_pass http://127.0.0.1:23333;
# 支持反代 WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 最大文件上传大小限制。设置0为不限制
client_max_body_size 0;
# 关闭缓存
proxy_request_buffering off;
proxy_buffering off;
}
# HTTPS 证书与私钥位置
ssl_certificate /etc/nginx/ssl/domain.crt;
ssl_certificate_key /etc/nginx/ssl/domain.key;
# 传输时默认开启gzip压缩
gzip on;
# 传输时会被压缩的类型(应当依据文件压缩效果添加)
gzip_types text/plain text/css application/javascript application/xml application/json;
# 反向代理时,启用压缩
gzip_proxied any;
# 传输时压缩等级,等级越高压缩消耗CPU越多,最高9级,通常5级就够了
gzip_comp_level 5;
# 传输时大小达到1k才压缩,压缩小内容无意义
gzip_min_length 1k;
# 支持协议、算法与超时时间等 一般无需更改
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
}
# MCSM节点端开启HTTPS反向代理
server
{
# 节点 公网HTTPS端口(可用多个listen监听多个端口)
listen 2444 ssl http2; #IPV4
listen [::]:2444 ssl http2; #IPv6
# 开启HSTS 开启后将强制使用HTTPS连接节点并在取消此策略后持续一年除非在浏览器手动清除策略。
# 默认未开启,可取消注释开启.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# DNS服务器,仅在目标节点需要使用域名连接时需要。
resolver 8.8.8.8;
# 自动重定向HTTP连接至HTTPS
error_page 497 https://$host:$server_port$request_uri;
proxy_hide_header Upgrade;
location / {
# 请求头 一般无需更改
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
#目标节点的地址与端口。支持使用域名及https连接。
proxy_pass http://127.0.0.1:24444;
# 支持反代 WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 最大文件上传大小限制。设置0为不限制
client_max_body_size 0;
# 关闭缓存
proxy_request_buffering off;
proxy_buffering off;
}
# HTTPS 证书与私钥位置
ssl_certificate /etc/nginx/ssl/domain.crt;
ssl_certificate_key /etc/nginx/ssl/domain.key;
# 传输时默认开启gzip压缩
gzip on;
# 传输时会被压缩的类型(应当依据文件压缩效果添加)
gzip_types text/plain text/css application/javascript application/xml application/json;
# 反向代理时,启用压缩
gzip_proxied any;
# 传输时压缩等级,等级越高压缩消耗CPU越多,最高9级,通常5级就够了
gzip_comp_level 5;
# 传输时大小达到1k才压缩,压缩小内容无意义
gzip_min_length 1k;
# 支持协议、算法与超时时间等 一般无需更改
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
}
记得把/etc/nginx/ssl/domain.crt
和/etc/nginx/ssl/domain.key
替换成对应的你的证书和私钥路径。
按F2
,y
保存文件。
启动Nginx
systemctl start nginx
然后轻松翻车:
[root@NekoWorks conf.d]# systemctl start nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.
查看原因:
# journalctl -xe
-- Support: https://access.redhat.com/support
--
-- The unit nginx.service has successfully entered the 'dead' state.
Nov 10 18:20:59 NekoWorks systemd[1]: Stopped The nginx HTTP and reverse proxy server.
-- Subject: Unit nginx.service has finished shutting down
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit nginx.service has finished shutting down.
Nov 10 18:20:59 NekoWorks systemd[1]: Starting The nginx HTTP and reverse proxy server...
-- Subject: Unit nginx.service has begun start-up
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit nginx.service has begun starting up.
Nov 10 18:20:59 NekoWorks nginx[2300538]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Nov 10 18:20:59 NekoWorks nginx[2300538]: nginx: [emerg] bind() to 0.0.0.0:2333 failed (13: Permission denied)
Nov 10 18:20:59 NekoWorks nginx[2300538]: nginx: configuration file /etc/nginx/nginx.conf test failed
Nov 10 18:20:59 NekoWorks systemd[1]: nginx.service: Control process exited, code=exited status=1
Nov 10 18:20:59 NekoWorks systemd[1]: nginx.service: Failed with result 'exit-code'.
-- Subject: Unit failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- The unit nginx.service has entered the 'failed' state with result 'exit-code'.
Nov 10 18:20:59 NekoWorks systemd[1]: Failed to start The nginx HTTP and reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit nginx.service has failed.
--
-- The result is failed.
关掉SELinux,重新启动服务,一切正常。。。
原因很明显,那就是SELinux阻止了Nginx进行端口监听!
SELinux出来挨打!
设置SELinux允许Nginx监听端口
我们来设置允许Nginx进行端口监听:
semanage port -a -t http_port_t -p tcp 2333
semanage port -a -t http_port_t -p tcp 2444
这下再次启动Nginx,应该是正常启动了。
等等,怎么打开网页居然是502错误?!不对啊喂!
关掉SELinux,又一切正常,看来还是暗藏玄坤。
设置SELinux允许Nginx进行网络连接
我们来设置允许HTTP服务进行网络连接。
setsebool -P httpd_can_network_connect on
执行完后,再次访问管理面板,就一切正常了。