Nginx 安装和配置
信息
本次以 Debian 为例:如果不是Debian,请参考:官方教程 安装,如果已经安装Nginx,可跳过
前提条件:
1
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
导入密钥,验证包的正确性:
1
2
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
验证下载的文件是否包含正确的密钥:
1
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
输出应包含完整指纹573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62如下:
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key signing-key@nginx.com
如果指纹不同,删除文件。
二选一:
要为稳定的 nginx 包设置 apt 存储库,请运行以下命令:
1
2
3
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
如果希望使用 mainline nginx 包,请改为运行以下命令:
1
2
3
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
设置存储库固定,使用Nginx官方的软件包而不是发行版提供的软件包:
1
2
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
要安装 nginx,请运行以下命令:
1
2
sudo apt update
sudo apt install nginx
Certbot安装
(1)安装snap
certbot官方已经说了,各个发行版安装的certbot版本落后,功能不全,推荐我们使用snap安装,我之前就是用的是apt安装,后来一堆问题,血的教训!!
1
2
3
4
5
6
7
8
# 安装snap
sudo apt update
sudo apt install snapd
# 重启系统
# 安装core
sudo snap install core
sudo snap refresh core
(2)安装certbot
安装之前确保没有其他方式安装的certbot
如:apt,pip
可通过这条命令查看 whereis certbot
如果有,卸载它们
sudo apt remove certbot
sudo pip uninstall certbot
1
2
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
(3)查看版本
Certbot 插件
nginx
使用snap安装的版本是已经有的,申请方法为:
(1)先新建一个 nginx的配置文件,如 /etc/nginx/conf.d/abc.conf
(2)编辑 abc.conf
,填入以下模板,根据自己实际情况修改
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name domain.com;
location / {
proxy_pass http://127.0.0.1:80; # 替换为你的应用程序地址
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_set_header X-Forwarded-Proto $scheme ;
}
}
(3)使用 certbot 的nginx插件申请
1
2
# 可以先查看哪些可以申请,是否列出了需要的域名
sudo certbot --nginx
额外的,申请前保证域名解析到当前的ip
certbot-dns-dnspod
此插件用于dns申请的,好处可以用于申请泛域名证书证书。也就是像 *.seektao.cc
这种,一次申请,到处使用,方便至极。
certbot-dns-dnspod 是dnspod的插件,默认的certbot是没有的,需要手动安装
1
2
3
sudo snap install certbot-dns-dnspod
sudo snap set certbot trust-plugin-with-root= ok
sudo snap connect certbot:plugin certbot-dns-dnspod
安装完成之后新建一个 .ini文件,比如 /etc/certbot/dnspod.ini
1
2
sudo mkdir /etc/certbot
sudo touch /etc/certbot/dnspod.ini
编辑 dnspod.ini,填入下面的内容,点此跳转到dnspod api 申请页面 ,注意申请的是dnspod token
1
2
dns_dnspod_api_id = xxxxxxx
dns_dnspod_api_token = xxxxxxxxxxxxxbcdef
1
sudo chmod 600 /etc/certbot/dnspod.ini
申请,替换为自己的域名
1
2
3
4
5
6
7
8
9
10
11
sudo certbot certonly -a dns-dnspod \
--dns-dnspod-credentials /etc/certbot/dnspod.ini \
-d "*.yourdomain.com"
接着就是:
输入邮箱,
是否同意注册acme(选Y),
是否同意发送邮件。。。
接着等待,等待。。就完成了
证书文件保存在 /etc/letsencrypt/live
1
2
3
4
5
# 其中
[ cert name] /privkey.pem:证书的私钥。
[ cert name] /fullchain.pem:在大多数服务器软件中使用的证书文件。
[ cert name] /chain.pem:在Nginx >= 1.3.7 中用于 OCSP stapling。
[ cert name] /cert.pem:会破坏许多服务器配置,不应在未进一步阅读文档的情况下使用。
我们用到 privkey.pem,fullchain.pem即可。
关于 dnspod 申请ssl证书就是如此。
certbot-dns-cloudflare
1
2
3
4
5
6
7
8
9
10
11
12
sudo snap install certbot-dns-cloudflare
# 如果提示如下错误信息,输入:sudo snap set certbot trust-plugin-with-root=ok
# 接着重新执行 sudo snap install certbot-dns-cloudflare
error: cannot perform the following tasks:
- Run hook prepare-plug-plugin of snap "certbot" ( run hook "prepare-plug-plugin" :
-----
Only connect this interface if you trust the plugin author to have root on the system.
Run ` snap set certbot trust-plugin-with-root= ok` to acknowledge this and then run this command again to perform the connection.
If that doesn' t work, you may need to remove all certbot-dns-* plugins from the system, then try installing the certbot snap again.
-----)
申请api token,点此跳转
在 /etc/certbot
新建 cloudflare.ini
,将下面的值替换为自己申请的api token
1
2
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = xxxxxxxxxxxxxxxxx
建议修改权限
1
sudo chmod 600 cloudflare.ini
申请方式:将以下的文件和域名替换为自己的
1
2
3
4
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/certbot/cloudflare.ini \
-d "*.youdomain.com"
certbot-dns-huawei(待编辑)
此插件用于dns申请的,好处可以用于申请泛域名证书证书。也就是像 *.seektao.cc
这种,一次申请,到处使用,方便至极。
certbot-dns-dnspod 是dnspod的插件,默认的certbot是没有的,需要手动安装
1
2
3
sudo snap install certbot-dns-dnspod
sudo snap set certbot trust-plugin-with-root= ok
sudo snap connect certbot:plugin certbot-dns-dnspod
安装完成之后新建一个 .ini文件,比如 /etc/certbot/dnspod.ini
1
2
sudo mkdir /etc/certbot
sudo touch /etc/certbot/dnspod.ini
编辑 dnspod.ini,填入下面的内容,点此跳转到dnspod api 申请页面 ,注意申请的是dnspod token
1
2
dns_dnspod_api_id = xxxxxxx
dns_dnspod_api_token = xxxxxxxxxxxxxbcdef
1
sudo chmod 600 /etc/certbot/dnspod.ini
申请,替换为自己的域名
1
2
3
4
5
6
7
8
9
10
11
sudo certbot certonly -a dns-dnspod \
--dns-dnspod-credentials /etc/certbot/dnspod.ini \
-d "*.yourdomain.com"
接着就是:
输入邮箱,
是否同意注册acme(选Y),
是否同意发送邮件。。。
接着等待,等待。。就完成了
证书文件保存在 /etc/letsencrypt/live
1
2
3
4
5
# 其中
[ cert name] /privkey.pem:证书的私钥。
[ cert name] /fullchain.pem:在大多数服务器软件中使用的证书文件。
[ cert name] /chain.pem:在Nginx >= 1.3.7 中用于 OCSP stapling。
[ cert name] /cert.pem:会破坏许多服务器配置,不应在未进一步阅读文档的情况下使用。
我们用到 privkey.pem,fullchain.pem即可。
关于 dnspod 申请ssl证书就是如此。
自动续期
自动续期添加一个定时任务即可
1
2
3
4
5
# 设置定时任务
sudo crontab -e
# 每月1号的午夜执行 certbot renew 命令来续订证书
0 0 1 * * /usr/local/bin/certbot renew
需要注意自己的certbot执行路径是否正确
which certbot
可以看到certbot执行路径
一键脚本
经过上面的步骤,你会发现每新增一个服务,需要
新增nginx配置文件
配置nginx文件
验证并重启nginx服务
这时候发现服务器每新增一个服务,就需要添加、修改nginx配置文件,域名和端口这些都需要修改,申请ssl证书,这些步骤相当麻烦。
如果没有一个简单的nginx模板,则会更加复杂繁琐。基于以上需求,我编写了一个脚本。功能 :配置好服务后,只需要一条命令即可完成nginx配置,并配置ssl证书
命令为:
如果需要获取原文和脚本,关注公众号"寻道之旅",发送"nginx"获取 。