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替换成对应的你的证书和私钥路径。
F2y保存文件。

启动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

执行完后,再次访问管理面板,就一切正常了。