CentOS 8 Nginx建站记录

Posted by ColasDAD on 26 Aug, 2022

之前我介绍了如何用VPS来自建Shadowsocks服务器,但有些VPS提供的资源很丰富,仅仅是用来跨个境未免太浪费了。仔细想想现在享受各种互联网服务商提供服务时免不了被进行各种各种审查和限制,要完整真实表达自己的想法,不如自己建个站把。同时我们这里对Shadowsocks进行一下优化,让它嵌套在我们创建的真实网站中来提供服务,提高隐蔽性,减少被识别的风险。

1. 系统优化和安装必要软件

密码设置

CentOS 8的VPS拿到手后一般都是有root用户的,对于系统应用安全性问题,并不是用root就真的不安全,而是看怎么使用的。进入系统后,首先修改密码,保证一定的复杂度,避免被轻易暴力破解。输入passwd

系统防火墙设置

密码修改后,紧接着就要设置防火墙,关闭和开启应用或端口的公网访问权限。网络安全一大特点,提供的服务越少越安全。Simple is best。CentOS 8自带的防火墙应用是firewalld,一般会随机安装,但是没有默认启动,按照如下操作安装或启动:

#如果没有安装firewalld,通过如下命令进行安装
dnf -y install firewalld
#查看firewalld防火墙是否启动
firewall-cmd --state
#如未启动通过下一条命令启动
systemctl start firewalld.service
#通过下一条命令将firewalld设置为长期启动的服务,这样重启或者程序异常退出后都会自动启动
systemctl enable firewalld.service

防火墙启动后就可以进行相关配置了。推荐关掉系统默认对全网开放的ssh和cockpit服务,然后通过各种方式来限制外网对本机核心服务的访问范围,最后对全网放开http和https的服务访问,毕竟我们是要来建站的。操作命令参考如下:

#配置指定的地址段才能访问服务器的任何服务,这种配置方式是允许某些IP地址段访问,特别适合位置IP比较固定的情况,我最喜欢用。
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="20.17.0.0/18" accept"
#在上一条命令配置妥当的情况下,建议在防火墙上关闭系统默认启动的ssh和cockpit服务,启用http和https服务为后续建站做准备。
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

配置防火墙后,需要重新加载配置进行生效:

#重新加载,生效已配置的规则
firewall-cmd --reload
#检查已经生效的规则,如有不对的请及时修改并reload
firewall-cmd --list-all

网络BBR优化

BBR是Google开发的针对TCP的拥塞控制算法,只能优化TCP数据包的传输,在现阶段国内出国带宽严重紧张的情况下,一定程度上能提高我们的使用体验的。CentOS 8启用BBR非常简单,只需要简单几行代码就能启用,命令如下:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

修改SELinux设置

有些系统装好后SELinux设置不允许HTTPD脚本及模块与网络连接,需要进行调整,不然会影响到nginx反向代理,造成nginx反代时报错“[crit] 1197#0: *1 connect() to 127.0.0.1:8443 failed (13: Permission denied)”,修改配置的命令如下:

setsebool -P httpd_can_network_connect 1

允许Nginx使用1024以下端口

有些系统装好后启动nginx会报错“nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)”,需增加semanage port解决。

semanage port -a -t http_port_t -p udp 80

更新操作系统及已安装软件

基本配置完成后建议对系统和软件进行更新,推荐之后也定期执行,这种操作不建议自动,最好人工干预,操作方法如下:

dnf -y update
#安装语言包
dnf install langpacks-en glibc-all-langpacks -y

2. 创建你的Web服务

系统准备好后我们就可以开始建站了。

申请域名

域名可以用免费的或者自己买。免费的的话推荐去No-IP注册一个免费二级域名(每个免费用户最多可注册3个二级域名),只需每个月手动确认一次即可永久用下去。自己买的话推荐去NameSilo买,一个com域名一年也就¥60.00左右。域名申请好后需在服务商提供的管理页面将域名指向你的VPS的公网IP,一般配置好后到DNS解析生效会需要一定时间,DNS生效情况可以通过DNS Checker查询。

安装Nginx

Nginx (engine x) 是一款轻量级的 Web 服务器,能够直接做HTTP静态服务器,也能做正向和反向代理、负载均衡等,并且有很高的效率和扩展性,是现在市场占有率最高的 Web 服务器。Nginx安装好后就可以直接用静态页面做一个简单网站了,很适合初学建站。安装方法如下:

dnf -y install nginx
#安装nginx的stream模块
dnf -y install nginx-mod-stream
#为之后申请的HTTPS证书创建存放目录
mkdir /etc/pki/nginx/
mkdir /etc/pki/nginx/private/

安装好后修改/etc/nginx/nginx.conf配置文件,将conf文件中server_name _;客户化为自己申请的域名server_name 你的网站域名;,conf中有两个server_name都需要修改,第一个是给HTTP服务用的,第二个是给HTTPS服务用的。

完成客户化后,就可以启动Nginx了,命令如下:

#启动
systemctl start nginx
#将nginx设置为自动启动的服务
systemctl enable nginx

启动好后就可以直接访问http://你VPS的IP/或者http://你的网站域名/看看效果了。默认的Nginx配置只开放了HTTP的服务,并提供了静态资源的访问支持,资源都放在系统/usr/share/nginx/html目录下,可以自行修改做出一个完善的静态网站。如要Web服务器开启HTTPS支持请继续往下看。

申请SSL/TLS证书

HTTPS的访问都需要SSL/TLS证书,我们可以用acme.sh简单自动的从Let's Encrypt生成免费的证书。acme.sh安装好后还会自动的创建一个定时任务,定期自动对你申请的证书进行有效期更新。acme.sh安装方法如下:

#安装acme.sh
curl https://get.acme.sh | sh
#使用acme.sh配合已安装的Nginx进行域名证书申请
/root/.acme.sh/acme.sh --issue --nginx --keylength ec-256 --server letsencrypt -d 你的网站域名

证书申请好后我们需要将证书安装到Nginx的配置目录下,并进行配置。我们先修改/etc/nginx/nginx.conf,将conf中如下部分内容每行第一个注释用的“#”号删除,解开对HTTPS的功能限制。

#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  你的网站域名;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

完成配置后继续将已申请号的证书放置到Nginx配置的证书目录中去,并重新启动Nginx生效配置,命令如下:

/root/.acme.sh/acme.sh --install-cert --ecc -d 你的网站域名 \
--key-file       /etc/pki/nginx/private/server.key  \
--fullchain-file /etc/pki/nginx/server.crt \
--reloadcmd     "systemctl restart nginx"

完成后可以直接访问https://你VPS的IP/或者https://你的网站域名/再看看有什么不一样。HTTP是未加密的数据,没有HTTPS安全,推荐都是使用HTTPS来进行网页的访问。

让自己的网站获得SSLtest A+评分

用nginx默认配置启用HTTPS后并不代表网站就一定安全,网站的HTTPS安全和兼容性评估可以通过SSL Labs进行查询,默认配置应该能拿到A,如果想拿到A+,可以按照下面优化配置。

/etc/nginx/nginx.conf中这一行内容

        ssl_ciphers PROFILE=SYSTEM;

替换为

        # SSL 
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

        # HSTS (ngx_http_headers_module is required) (63072000 seconds)
        add_header Strict-Transport-Security "max-age=63072000" always;

        # OCSP stapling
        ssl_stapling             on;
        ssl_stapling_verify      on;

修改完配置后记得systemctl restart nginx重启服务。


3. 丰富你的 Web 服务

将Shadowsocks作为Web服务通过Nginx的反向代理来提供服务

前面的文章我介绍了如何用一键脚本安装Shadowsocks服务,此方法虽然简单,但是使用的只是简单的混淆,对于行为的隐藏并不是很有效,如果想让自己的行为更具有隐蔽性,可以参考此方案。

安装Shadowsocks及相关插件

安装Shadowsocks可直接执行下列命令,现在的方法为直接用github上获取的Shadowsocks-libev源码进行编译:

#安装编译依赖包和软件
dnf -y install epel-release
dnf -y install tar wget git gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto c-ares-devel libev-devel libsodium-devel mbedtls-devel
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init
./autogen.sh && ./configure --disable-documentation && make
make install

至此Shadowsocks-libev安装完毕。下面安装插件v2ray-plugin,这个插件也是Shadowsocks-libev的作者写的,目的主要是让Shadowsocks-libev获取像v2ray那样的https接入能力。软件作者一般都会提供适配不同平台已编译好的可执行程序,直接去https://github.com/shadowsocks/v2ray-plugin/releases上下载即可。获取方式如下,注意请根据版本更新情况和平台类型修改一下第一行获取的文件路径:

wget https://github.com/shadowsocks/v2ray-plugin/releases/download/v1.3.2/v2ray-plugin-linux-amd64-v1.3.2.tar.gz -O /usr/local/bin/v2ray-plugin.tar.gz
tar zxvf /usr/local/bin/v2ray-plugin.tar.gz -C /usr/local/bin/
rm -f /usr/local/bin/v2ray-plugin.tar.gz
mv /usr/local/bin/v2ray-plugin_* /usr/local/bin/v2ray-plugin

安装好插件后进行参数配置。

mkdir /etc/shadowsocks-libev
vi /etc/shadowsocks-libev/config-v2ray.json

config-v2ray.json完整配置如下:

{
    "server":"127.0.0.1",
    "server_port":8443,
    "password":"自己设置的密码",
    "timeout":300,
    "user":"nobody",
    "method":"chacha20-ietf-poly1305",
    "fast_open":true,
    "nameserver":"8.8.8.8",
    "mode":"tcp_only",
    "plugin":"v2ray-plugin",
    "plugin_opts":"server"
}

我这里“server”指定的“127.0.0.1”是本机私有地址,外面是不能直接访问的,后面会交由Nginx做反向代理访问;加密方式“method”推荐设置“chacha20-ietf-poly1305”;服务方式“mode”设置为“tcp_only”是因为主流Web实际只有TCP,虽然Nginx也支持用Stream实现UDP代理,但是现有Shadowsocks用的UDP的数据包会被特征识别,破坏整体隐蔽性,所以网站安心只用用TCP就好。

将Shadowsocks设置为系统服务

创建/lib/systemd/system/ssl-v2ray.service文件,内容如下:

[Unit]
Description=Shadowsocks-libev v2ray Server
After=network.target

[Service]
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks-libev/config-v2ray.json
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

创建好配置后执行如下命令将配置好的Shadowsocks服务启用:

systemctl daemon-reload
systemctl start ssl-v2ray.service
systemctl enable ssl-v2ray.service

启动后服务并不能从公网进行访问,需要使用Nginx做一下反向代理。另外,服务的运行状况和命令输出可以使用systemctl status ssl-v2ray --no-page -l -n100来查看。

利用Nginx反向代理Shadowsocks的服务

使用Nginx来进行证书验证和反向代理可以让部署的Shadowsocks服务隐藏在正常网站中,从而有效抵抗主动探测。并且可以开启多个Shadowsocks服务让Nginx做统一调度。为实现这个功能,我们需要再次修改一下/etc/nginx/nginx.conf文件,将conf文件中HTTPS服务部分增加如下内容,注意“你的PATH”部分要按照自己的需求客户化:

        location /你的PATH/ {
                proxy_pass http://127.0.0.1:8443/;
                proxy_redirect              off;
                proxy_http_version          1.1;
                proxy_set_header Upgrade    $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host       $http_host;
        }

修改完Nginx配置后记得systemctl restart nginx重启服务生效配置。至此服务器端的配置已经完成,客户端只需使用前期配置的域名,你的PATH和密码进行配置后即可访问。

直接用静态HTML模板来做网站

如果想简单做个页面展示展示内容,可以直接下载一个漂亮的HTML模板修改后实现,这里推荐一个免费模板的下载处html5up,这里有很多的免费的模板可供选择,下载后直接解压到/usr/share/nginx/html下就可以使用。

自建其它Web服务,通过Nginx的反向代理来提供服务

如有其它Web服务,比如自己用python写一个,可以修改/etc/nginx/nginx.conf来使用Nginx进行反向代理:

        location / {
                proxy_pass http://127.0.0.1:8081/;
        }

甚至可以透传udp:

stream {
        server {
                listen 443 udp;
                proxy_pass 127.0.0.1:8443;
        }
}

   跨境    DIY   

 Share on: Twitter / Facebook / Google+ / Email