手把手教学:在Ubuntu上安装Nginx反向代理和Let‘sEncrypt进行SSL加密
背景:
看标题这个内容实在并不新颖,Ubuntu和Nginx是再普通不过的两个软件,之所以写这篇文章,是因为近期有很多问我这个问题,而且正是因为这两个软件足够成熟和稳定,几乎是服务器端的必选软件,我就花了点时间,整理一些这个过程。
准备工作:
当然是一个安装了Ubuntu的系统,可以是云VM,比如AWS的免费EC2,阿里云,腾讯云的VM等等,也可以是本地的电脑、笔记本,甚至可以是一个Docker容器。本文描述的方法对于Ubuntu 20 和 22都是适用的。
开搞:
登录到Ubuntu系统,如果是云上VM,通常用ssh,如果是本地那就直接登录进去,如果是Docker容器,可以用SSH或者docker exec启动终端。
第一步:
安装Nginx
sudo apt update
sudo apt install nginx
第二步:
运行默认Nginx看看是否安装正常。注意如果是云VM需要打开Security Group(或者安全组)的端口,默认是需要打开80和443端口
http://[ip地址]:80
我使用的是云主机,所以需要用你自己的ip地址,如果是本机,那就是127.0.0.1
,如果是Docker容器,那么是你Host主机的地址再加上你主机host的映射端口。
如果你能看到这个,那么恭喜你,nginx的基本安装已成功了。
第三步:
设置反向代理
为了演示,我在同一个机器上启动一个web服务,为了保持这个web服务一直在后台运行,我启动一个python的http服务并运行在8888端口上。由于我们会使用反向代理,所以8888端口不需要在SecurityGroup里面开放端口
screen -S myserver
python3 -m http.server 8888
Ctrl-A-D
这里的“screen"是多终端工具,用来保持一个程序在后台运行,即使ssh退出后也不会终止,安装screen的方法
sudo apt install screen
最后的"Ctrl-A-D"是按住Ctrl并依次按A和D,这样可以退出screen回到当前会话中。
这样8888端口上就有web服务了。
现在,我们来建立这个反向代理
cd /etc/nginx/sites-available
sudo nano mytest.yesmiracle.net
我们先建立一个配置文件,可以看到文件名就是我准备使用的域名,注意这个域名等一下需要到你的域名服务商那里映射到你这个机器的ip地址上。如果你是在本机上安装nginx的,那么这个文件名随便取名。
文件的内容是:
server {
server_name mytest.yesmiracle.net;
listen 80;
listen [::]:80;
location / {
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8888/;
}
}
简单解释一下,“server_name” 就是我的域名,在目前这一步,你可以用任意的名字,监听80端口,后面的location块是反向代理部分,也就是把外部进来的80端口的请求都转给内部的8888端口,而8888端口就是上面我设置的python http server
激活我们的网站配置
cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/mytest.yesmiracle.net mytest.yesmiracle.net
sudo rm default
sudo systemctl restart nginx
最后一步是重启nginx服务。
第四步:
测试一下服务,注意8888端口不需要在SecurityGroup里开放,但是80和443一定不能忘记开放。
http://[ip]
这样就可以看到网站了,但是注意地址栏左侧有个三角形标志,表示网站未采用SSL加密,是不安全的网站,下面我们用Let’sEncrypt来加密网站。
第五步:
激活SSL,安装Let’s Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d mytest.yesmiracle.net
安装之前要先确保域名服务商那里已经添加了一条类型为A的域名记录,即把mytest子域名映射到IP地址,该ip是你的服务器地址。
注意,如果你是在本机安装的,那么外网上是无法访问到你家庭宽带里面的web服务的,除非有内外穿透的工具(可以看我之前的nps和npc的文章)
安装程序会首先问你一个Email地址(不一定要真实),再问你是否同意用户服务协议(选Y),最后问你是否愿意把email共享给其他合作方(选N)
最后,会显示证书已成功下载,
这时如果再看下nginx的配置文件,我们会发现多了几行:
server {
server_name mytest.yesmiracle.net;
location / {
proxy_redirect off;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8888/;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mytest.yesmiracle.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mytest.yesmiracle.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = mytest.yesmiracle.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name mytest.yesmiracle.net;
listen 80;
listen [::]:80;
return 404; # managed by Certbot
}
可以看到Certbot帮我吗添加了好几行配置,这个配置主要是两个作用
- 将http(80)自动转换为https(443)
- 为443端口下的服务添加ssl证书配置
现在,就可以用户https来访问web服务了
https://[ip]
注意多了个s, 而且不在提示“网站不安全”了
好了,到此为止,nginx反向代理和Let‘sEncrypt加密都已经完成了。