初始化 VPS
-
ssh 登录到远程服务器的 root 用户后再完成以下操作:
更新系统已知的软件包列表、升级系统上的所有软件包、移除不再需要的依赖软件包:
apt update && apt upgrade && apt autoremove
正经的 Linux 用户不会用 root 干所有的事情,如果这么做的话将会很危险。创建一个普通的用户,并让它可以通过 sudo 指令用 root 权限执行命令是一般的解决方案。
-
在用 sudo 之前,我们需要先安装 sudo 这个软件包:
apt install sudo
-
新建一个普通用户,本文新建名为
eric
的用户(同时创建相应的 home 目录),并将其添加到 sudo 用户组中;最后给 eric 设置一个密码:useradd -m -G sudo eric passwd eric
-
更改 eric 的默认 shell
chsh eric
-
相关建议(可选操作)
为了安全起见,建议你完成下列操作:
- 禁止通过 SSH 登录到 root 用户
- 限制 SSH 通过用户密码来登录,并实现 SSH 仅能通过密钥登录服务器
提一下要点,不知道怎么做的话就 Google 学习一下:
-
编辑
/etc/ssh/sshd_config
文件:PermitRootLogin no # 禁止通过 SSH 登录到 root 用户 PasswordAuthentication no # 限制 SSH 通过用户密码来登录
-
将本机公钥添加到远程服务器
本机 ssh 公钥路径 (如未生成使用 ssh-keygen 生成):~/.ssh/id_rsa.pub 然后将 ~/.ssh/id_rsa.pub 的内容追加到到服务器用户下的 ~/.ssh/authorized_keys 最后重启 sshd 服务
安装 nginx 前的准备
正经的 Linux 用户不会用 root 干所有的事情,如果这么做的话将会很危险。所以使用普通用户,再通过 sudo 指令用 root 权限执行命令是坠吼的。
使用普通用户通过 ssh 登录到你的远程服务器后再完成以下操作:
-
时间校准
sudo timedatectl set-ntp true # 启用 NTP 服务 sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 将时区设为“亚洲/上海” sudo hwclock --systohc # 将硬件时钟调整到与当前系统时间一致 date -R # 以 RFC 5322 格式输出日期和时间。例如 Mon, 18 Jan 2021 11:04:16 +0800
执行完之后,终端显示的时间如果正确,那么就没问题了。
-
防火墙初始化
本文将使用 ufw 来管理系统的防火墙
sudo apt install ufw sudo ufw enable sudo ufw allow 'OpenSSH'
-
安装相关软件包
更新系统已知的软件包列表、升级系统上的所有软件包、移除不再需要的依赖软件包:
sudo apt update && sudo apt upgrade && sudo apt autoremove
安装编辑器 vim(后续编写配配置文件需要,当然你也可以使用其他编辑器):
sudo apt install vim
Cloudflare 接管域名解析
- 添加记录并点亮小云朵
- SSL/TLS 里选择 Full (strict)
安装 Nginx 及其初始配置
请将本文中的
ijk.me
替换成您注册的域名
安装 Nginx
sudo apt install nginx
配置防火墙
sudo ufw allow 'Nginx Full'
配置 Nginx
-
Nginx 在安装过程中会创建一个默认的服务器块。如果它仍然存在,请将其删除,因为你后面将为你注册的域名配置一个自定义服务器块
sudo rm /etc/nginx/sites-enabled/default
-
使用如下命令,为你的域名创建目录
sudo mkdir -p /var/www/ijk.me/html
-
接下来,用
$USER
环境变量给当前的系统用户分配目录的所有权sudo chown -R $USER:$USER /var/www/ijk.me/html
-
使用命令确保 web root 具有正确的权限
sudo chmod -R 755 /var/www/ijk.me
-
接下来,使用
vim
或其他编辑器创建index.html
页面文件vim /var/www/ijk.me/html/index.html
文件写入以下内容:
<html> <head> <title>Welcome</title> </head> <body> <h1>Success! Your Nginx server is successfully configured. </h1> <p>This is a sample page.</p> </body> </html>
-
我们需要创建一个服务器块,指向我们自定义的 web root。我们不直接修改默认的配置文件,而是新建一个文件
sudo vim /etc/nginx/sites-available/ijk.me
填写以下内容:
server { listen 80; listen [::]:80; root /var/www/ijk.me/html; index index.html index.htm index.nginx-debian.html; server_name ijk.me www.ijk.me; location / { try_files $uri $uri/ =404; } }
-
接下来,让我们通过在
sites-enabled
目录下创建一个符号链接来启用这个服务器块,Nginx 在启动时会在这个目录下读取配置文件:sudo ln -s /etc/nginx/sites-available/ijk.me /etc/nginx/sites-enabled/
-
为了防止可能出现的内存问题,有必要调整
/etc/nginx/nginx.conf
文件中的一个值sudo vim /etc/nginx/nginx.conf
找到
server_names_hash_bucket_size
,将#
符号去掉,取消这一行的注释... http { ... server_names_hash_bucket_size 64; ... } ...
-
接下来,测试一下 Nginx 文件中是否有语法错误
sudo nginx -t
-
最后,若你的配置测试没有遇到问题,重启 Nginx 来启用你的更改
sudo systemctl restart nginx
-
现在可以访问您注册的域名了,如下:
配置https(acme.sh配置)
生成 TLS 证书和私钥
生成证书的方法有很多,这里我们使用 acme.sh 生成证书。
-
安装
acme
:curl https://get.acme.sh | sh -s email=xxx@qq.com
执行上面命令,然后使用命令
ls -al
,我们就可以看到安装完毕,安装在.acme.sh
隐藏文件夹内了。 -
使用 Global Key:
Global Key 可以在 这个页面 看到,将这个 Key 导入到环境变数中
export CF_Key="example_key" export CF_Email="yourname@example.com"
-
进入文件夹
.acme.sh
并申请证书:cd .acme.sh ./acme.sh --issue --dns dns_cf -d ijk.me -d www.ijk.me
证书都生成在
/root/.acme.sh/ijk.me_ecc/
文件夹下了 -
修改前文
sudo vim /etc/nginx/sites-available/ijk.me
内容为(域名记得替换为自己的域名):server { listen 80 default_server; listen [::]:80 default_server; server_name ijk.me www.ijk.me; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate "/root/.acme.sh/ijk.me_ecc/fullchain.cer"; ## 此处相关证书替换为自己的 ssl_certificate_key "/root/.acme.sh/ijk.me_ecc/ijk.me.key"; ## 此处相关证书替换为自己的 ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # HSTS (ngx_http_headers_module is required) (63072000 seconds) add_header Strict-Transport-Security "max-age=63072000" always; server_name ijk.me www.ijk.me; root /var/www/ijk.me/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } }
-
验证是否正确
sudo nginx -t
-
重新加载nginx使之生效:
sudo nginx -s reload
-
这时访问
ijk.me
或www.ijk.me
,一切妥当。
过期手动更新
acme.sh --renew -d example.com --force
acme.sh --renew -d example.com --force --ecc # 如果用的是ECC证书
由于我的acme.sh
安装在/root/.acme.sh/
此目录下。所以完整的手动更新证书命令为:
cd /root/.acme.sh/
./acme.sh --renew -d ijk.me --force
上面是手动更新证书,下面我们介绍自动更新证书。因为acme颁发的证书有效期90天,所以我们每2个月更新一次证书就行。
使用Linux的crontab -e
设置自动更新SSL证书:
# 1,3,5,7,9,11月的1号,1点30更新证书
30 01 1 1,3,5,7,9,11 * /root/.acme.sh/acme.sh --renew -d ijk.me --force
# 1,3,5,7,9,11月的1号,2点30重新启动nginx服务器
30 02 1 1,3,5,7,9,11 * /usr/sbin/nginx -t && nginx -s reload && /usr/sbin/nginx
以上命令表示奇数月份的每月2号0点38分自动执行更新证书脚本/root/.acme.sh/acme.sh --renew -d ijk.me --force
自启并启动相关服务
sudo systemctl enable nginx --now # 自启并启动 Nginx 的服务
sudo systemctl status -l nginx # 查看 Nginx 服务的状态
TCP BBR
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由 Google 设计的一种拥塞控制算法。自从 Linux Kernel 4.9 开始就引入了该算法,但默认没有启用,所以需要手动开启。
启用该算法仅需在 /etc/sysctl.conf
文件末尾追加两行内容:
sudo bash -c "echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf"
sudo bash -c "echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf"
接下来你需要重启系统或者直接 使用 *systemctl* 重载变更。
sudo sysctl --system
您可以使用以下 sysctl 命令验证配置是否生效,如下:
sudo sysctl net.core.default_qdisc
注:若输出结果为 net.core.default_qdisc = fq
,则配置已生效
sudo sysctl net.ipv4.tcp_congestion_control
注:若输出结果为 net.ipv4.tcp_congestion_control = bbr
,则配置已生效
评论区