原以为20.04的安装会比18.04方便很多。但是没想到坑也不少。
安装Nginx
Ubuntu 18.04自带的Nginx本身没有开启ngx_stream_ssl_preread_module
。我们安装Nginx官方提供的版本,这个版本开启了所有的可开启扩展。
sudo vi /etc/apt/sources.list
在文件最下面添加并保存
# for latest nginx
deb http://nginx.org/packages/mainline/ubuntu/ focal nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ focal nginx
添加服务器签名,签名在这里nginx_signing.key。
wget http://web.archive.org/web/20180805232520/http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
安装Nginx并开启防火墙端口
因为防火墙默认是关闭的,所以ufw的那步可以不做。
sudo apt update
sudo apt install nginx
sudo ufw allow 80
sudo ufw allow 443
sudo systemctl start nginx
sudo systemctl enable nginx
你现在可以打开浏览器,然后输入vps的ip地址,如果看到了nginx的欢迎界面,就代表nginx配置成功了。
配置Nginx多站点
单独安装的nginx,只包含一个最基本的配置,多站点的文件夹默认都没有配置。我们需要手动建立文件夹。
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled
然后编辑nginx.conf文件,将后者加入其中
vi /etc/nginx/nginx.conf
在include /etc/nginx/conf.d/*.conf;
,之后插入一行,粘贴include /etc/nginx/sites-enabled/*;
。
保存并退出。
假设你有一个网站叫example.com
,网页位置在/var/www/html/example.com/html
。新建一个配置文件。
sudo vi /etc/nginx/sites-available/example.com
内容如下
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/html/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
我们不用添加443端口,因为等下添加证书的时候,Certbot会帮我们自动生成新的配置文件。
将网站配置生效
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled
sudo systemctl reload nginx
参考上面的步骤,添加你所有的站点。之后,再额外添加一个站点,用于Trojan的识别。
最后添加的站点,一定要是一个不需要用的二级域名,而不要使用一级域名。因为我发现Nginx的预读有bug。如果你使用了一级域名,那么它的二级域名也都会匹配。这将导致错误。
一级域名指的是example.com这种,二级指的是mail.example.com这种。
这里我们假设额外配置一个叫tro.example.com的二级域名站点。
为Nginx添加SSL证书
通过浏览器访问网站https://certbot.eff.org,选择Nginx和Ubuntu 20.04,安照网站的提示安装certbot。
sudo apt update
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
申请证书
sudo certbot --nginx
按照提示进行操作。完成之后,你再通过浏览器访问网站,你会发现已经是https的了。
查看证书
cd /etc/letsencrypt/live/
ls
记住证书所在的文件夹名称,假设是“example.com”。
安装Trojan
虽然20.04自带了trojan,但是经过我的测试,20.04自带的trojan无法与nginx共同运行。trojan无法正常启动。所以,我们还是通过老办法进行安装。
如果你尝试了自带的trojan。自带的安装之后,配置文件在/etc/trojan。而不是/usr/local/etc/trojan。
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"
修改Trojan配置
sudo vi /usr/local/etc/trojan/config.json
找到"local_port",将443,改成4433或者你希望的端口。
找到"password",修改为你想要设置的密码。
找到"ssl",将"cert"设置为“/etc/letsencrypt/live/example.com/fullchain.pem"。将"key"设置为"/etc/letsencrypt/live/example.com/privkey.pem"。
保存并退出。运行Trojan。设置为开机启动。
sudo systemctl start trojan
sudo systemctl enable trojan
检查trojan是否正确启动
sudo systemctl reload trojan
如果命令不返回任何消息。证明trojan正常启动了。如果提示没有在运行的trojan,无法重载,就证明trojan没有启动。
配置Trojan+Nginx共存
sudo vi /etc/nginx/nginx.conf
在events和http两段之间,插入
stream {
map $ssl_preread_server_name $name {
tro.example.com trojan;
default nginx;
}
upstream trojan {
server 127.0.0.1:4433;
}
upstream nginx {
server 127.0.0.1:4443;
}
server {
listen 443;
listen [::]:443;
proxy_pass $name;
ssl_preread on;
}
}
保存,修改之前设置的所有网站的设置。打开/etc/nginx/sites-enable/
中所有的网站的配置,将所有的443端口,改成4443端口,然后保存。
sudo systemctl reload nginx
在好多支持Trojan的客户端中,域名是可选的。但是由于我们需要使用域名来进行跳转,所以在设置客户端时,域名是必填的,必须填写为
tro.example.com
。
Module ngx_stream_ssl_preread_module
开启HTTP/2
进入/etc/nginx/sites-enabled/
目录,修改其中的每个文件。
cd /etc/nginx/sites-enabled/
sudo vi example.com
将其中的
listen [::]:4443 ssl; # managed by Certbot
listen 4443 ssl; # managed by Certbot
改为
listen [::]:4443 ssl http2; # managed by Certbot
listen 4443 ssl http2; # managed by Certbot
找到include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
,注释掉,并在下面添加新行。
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
保存并关闭。重新加载nginx。
sudo systemctl reload nginx
测试HTTP/2已经生效
退出SSH与服务器的连接。在终端输入
curl -I https://example.com
输出结果如果有“HTTP/2 200”,就代表HTTP/2设置成功了。