前言
用户要求给部署网站配置https访问,配置过程中踩了一些坑,现作如下内容整理
正文
配置https访问总体来说需要两步,下面将做具体介绍:
1.生成SSL证书
2.配置nginx
1.生成SSL证书
有多种方式可以取得SSL证书,下面主要介绍两种方式。
(看是否申请好域名,没域名的情况下,可以使用自签名证书)
a.自签名证书(不推荐用于生产环境)
自签名证书可以用于开发或内部测试环境,但不被浏览器信任。
安装 OpenSSL
大多数 Linux 发行版已经预装了 OpenSSL。如果没有安装,可以通过以下命令安装:
bash
sudo apt-get update
sudo apt-get install openssl
获取证书
这个命令将生成一个自签名证书和私钥,有效期为 365 天
bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
证书文件路径
证书文件:/etc/nginx/ssl/nginx.crt
私钥文件:/etc/nginx/ssl/nginx.key
b.使用 Let's Encrypt(推荐)
Let's Encrypt 是一个免费、自动化的证书颁发机构,适合大多数网站。
安装 Certbot
Certbot 是 Let's Encrypt 的官方客户端工具,用于获取和自动配置 SSL 证书。
bash
sudo apt-get update
sudo apt-get install certbot
获取证书
使用 Certbot 获取证书。例如,如果你的域名是 example.com,运行以下命令:
bash
sudo certbot certonly --webroot -w /var/www/html -d example.com
这里 -w 指定了网站的根目录,-d 指定了域名。
证书文件路径
Let's Encrypt 会将证书文件放在 /etc/letsencrypt/live/your-domain/ 目录下:
证书文件:/etc/letsencrypt/live/your-domain/fullchain.pem
私钥文件:/etc/letsencrypt/live/your-domain/privkey.pem
自动续期
Let's Encrypt 的证书有效期为 90 天,但 Certbot 会自动续期。确保你的系统已配置定时任务:
bash
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
2. 配置 Nginx 以使用 SSL证书
修改 Nginx 配置文件,使其支持 HTTPS。以下是一个完整的示例配置:
(证书路径根据实际情况配置)
bash
# HTTP 重定向到 HTTPS
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
# 将所有 HTTP 请求重定向到 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name example.com; # example.com 是域名
# 指定 SSL 证书和密钥文件路径
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # 替换为你的证书路径
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 替换为你的密钥路径
# 主站配置
location / {
proxy_pass http://127.0.0.1:8080; # 代理到后端服务
}
}
3. 测试和验证配置
在应用配置之前,建议进行以下测试:
检查 Nginx 配置语法
bash
sudo nginx -t
如果配置文件没有语法错误,你会看到类似以下的输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载 Nginx
如果配置正确,重新加载 Nginx 服务:
bash
sudo systemctl restart nginx
验证 HTTPS
使用浏览器访问 https://example.com,确保网站正常加载,并检查浏览器地址栏是否显示"安全连接"。
常见错误及解决方法
以下是一些常见的 Nginx 配置文件错误及其解决方法:
1. 未知指令
错误示例:
bash
nginx: [emerg] unknown directive "some_directive" in /etc/nginx/nginx.conf:42
解决方法:
检查拼写错误,确保指令名称正确。
确保该指令在正确的上下文中使用。例如,某些指令只能在 server 块中使用,而不能在 http 块中使用。
如果你使用的是自定义模块,确保该模块已正确安装并加载。
2. 指令参数错误
错误示例:
bash
nginx: [emerg] invalid number of arguments in "some_directive" directive in /etc/nginx/nginx.conf:42
解决方法:
检查指令的参数是否正确。某些指令可能需要特定数量的参数。
参考 Nginx 官方文档,确保指令的使用方式正确。
3. 文件路径错误
错误示例:
bash
nginx: [emerg] open() "/etc/nginx/sites-enabled/default" failed (2: No such file or directory) in /etc/nginx/nginx.conf:42
解决方法:
检查文件路径是否正确。确保文件确实存在。
如果文件不存在,创建该文件或修改配置文件中的路径。
4. 权限问题
错误示例:
bash
nginx: [emerg] open() "/etc/nginx/ssl/nginx.crt" failed (13: Permission denied) in /etc/nginx/nginx.conf:42
解决方法:
检查文件的权限,确保 Nginx 用户(通常是 www-data 或 nginx)有权限访问该文件。
修改文件权限:
bash
sudo chmod 644 /etc/nginx/ssl/nginx.crt
sudo chown www-data:www-data /etc/nginx/ssl/nginx.crt
5.无法加载位于 /etc/nginx/ssl/nginx.crt 的证书文件,因为在该文件中找不到有效的 PEM 格式的证书数据
错误示例:
bash
nginx: [emerg] cannot load certificate "/etc/nginx/ssl/nginx.crt": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: configuration file /etc/nginx/nginx.conf test failed
解决方法:
检查证书文件格式,如果文件存在,确保它是以正确的 PEM 格式编写的。
证书文件应该以 -----BEGIN CERTIFICATE----- 开头,并以 -----END CERTIFICATE----- 结尾。可以使用 cat 命令查看文件内容:
bash
cat /etc/nginx/ssl/nginx.crt
如果文件内容不正确,你需要修正它或重新生成证书。
注:重新加载或重启 Nginx
修改完成后,再次使用 sudo nginx -t 查看配置语法,如果 sudo nginx -t 显示配置文件语法正确,你可以安全地重新加载或重启 Nginx 服务:
bash
sudo systemctl reload nginx
或者
bash
sudo systemctl restart nginx