Nginx作为一款高性能的开源web服务器反向代理软件,不仅具备强大的性能和灵活性,更是许多网站首选的搭建工具。在这篇博客中,将简单介绍Nginx的基本使用方法。此外,由于受信任的证书颁发机构 (CA) 签发的SSL证书通常需要支付一些费用,这里会介绍两种免费获取SSL证书的途径:通过openssl生成自签证书和利用Certbot工具配置Let’s Encrypt证书。
Nginx使用方法
安装Nginx
为你的域名新增一个的配置
1 sudo vi /etc/nginx/sites-available/your_domain.com
以下两个是可能的配置文件示例,http:80端口,https:443端口
1 2 3 4 5 6 7 8 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name example.com www.example.com; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 server { listen 443 ssl; server_name your_domain.com; ssl_certificate /path/to/your/ssl_certificate.crt; ssl_certificate_key /path/to/your/ssl_certificate.key; location / { proxy_pass http://0.0.0.0:9003; 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 ; } }
链接配置文件到sites-enabled
中,nginx服务只会加载sites-enabled
中的配置文件
1 sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
测试配置文件,检查是否有问题
使nginx服务重新加载配置文件
1 sudo systemctl reload nginx
如果你的网站是公共可访问的,并且你希望避免访问者看到不安全警告,考虑获取由受信任的证书颁发机构 (CA) 签发的证书。另外还有两种方式:
openssl生成自签的证书:浏览器访问时会出现警告,私人网络或测试环境中使用
Let’s Encrypt:免费 SSL 证书的证书颁发机构 下面是这两种证书的使用方法。
openssl生成自签的证书并且使用nginx配置https证书 OpenSSL自签名证书是由OpenSSL库提供的用于加密与认证的数字证书。自签名证书不受公共信任机构的信任,而是由证书持有人本身签名。因此,自签名证书在私人网络或测试环境中非常有用。
安装nginx、openssl
1 sudo apt install nginx openssl
创建服务器证书密钥文件 server.key
1 openssl genrsa -des3 -out server.key 2048
创建服务器证书的申请文件 server.csr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 openssl req -new -key server.key -out server.csr 输出内容为: Enter pass phrase for root.key: ← 输入前面创建的密码 Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音 Locality Name (eg, city) []:BeiJing ← 市的全名,拼音 Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名 Organizational Unit Name (eg, section) []: ← 可以不输入 Common Name (eg, YOUR name) []: ← 输入域名,如:iot.conet.com Email Address []:admin@mycompany.com ← 电子邮箱,可随意填 Please enter the following ‘extra’ attributes to be sent with your certificate request A challenge password []: ← 可以不输入 An optional company name []: ← 可以不输入
备份一份服务器密钥文件,去除文件口令
1 2 cp server.key server.key.orgopenssl rsa -in server.key.org -out server.key
生成证书文件server.crt
1 openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将证书配置到nginx中
使用 Certbot 工具配置 Let’s Encrypt 证书 Let’s Encrypt 是一个提供免费 SSL/TLS 证书的证书颁发机构。你可以使用 Let’s Encrypt 来获取一个免费的有效证书。有许多工具可以帮助你自动化这个过程,例如 Certbot,它是一个用于自动化证书获取和安装的工具。以下是在 Ubuntu 上使用 Certbot 和 Let’s Encrypt 获取证书的基本步骤:
1. 使用以下命令在 Ubuntu 上安装 Certbot 1 2 sudo apt updatesudo apt install certbot python3-certbot-nginx
2. 配置好 Nginx 如上面所说配置好nginx,例如现在只是监听http的80端口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 server { listen 80 default_server; listen [::]:80 default_server; server_name your_domain.com; root /var/www/html;; location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; include fastcgi_params; } location / { try_files $uri $uri / /yourls-loader.php$is_args $args ; index index.php index.html index.htm; } }
3. 获取证书 运行 Certbot 命令时,使用 -d
选项指定要为其获取证书的域名。例如,如果你的域名是 your_domain.com
,可以运行以下命令:
1 sudo certbot --nginx -d your_domain.com
根据 certbot
的提示配置 HTTPS 设置:
输入邮箱
输入(A)gree同意注册
输入y/n是否与电子前沿基金会(Let’s Encrypt)共享你的电子邮件地址,并接受电子邮件
接下来等待为指定的域名获取证书,并更新nginx配置
输入2配置http到https重定向,输入1不重定向
完成
这是配置完成后,自动更新后的nginx配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 server { server_name your_domain.com; root /var/www/html; location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ; include fastcgi_params; } location / { try_files $uri $uri / /yourls-loader.php$is_args $args ; index index.php index.html index.htm; } listen [::]:443 ssl ipv6only=on ; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { if ($host = your_domain.com) { return 301 https://$host $request_uri ; } listen 80 default_server; listen [::]:80 default_server; server_name your_domain.com; return 404 ; }
4. 配置自动更新 Let’s Encrypt 证书有一个有效期,通常为90天。为了确保证书始终有效,你应该设置自动更新。
执行证书自动更新测试
在设置自动更新之前,首先测试 Certbot 是否能够正确续订证书。运行以下命令:
1 sudo certbot renew --dry-run
这会模拟证书的续订过程,确保所有设置都正确。如果一切正常,你应该看到一条消息表明续订测试成功。
配置自动更新
Certbot 默认会在 /etc/cron.d/certbot
中创建一个 cron 任务,用于自动定期检查证书是否需要更新。你可以编辑此文件,检查自动更新的配置。
1 sudo vi /etc/cron.d/certbot
确保 cron 任务中有类似下面的内容:
1 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
上述 cron 任务表示 Certbot 将每12小时检查一次证书是否需要更新。如果需要更新,Certbot 将在静默模式下进行更新。
自定义定时任务(可选)
如果你想更改自动更新的频率,你可以根据需要编辑 cron 任务。修改 cron 表达式中的时间间隔,以满足你的要求。
Nginx+内网穿透隧道工作机制