在PHP开发环境中,Nginx作为高性能的Web服务器,与PHP的结合使用非常广泛,为了确保数据传输的安全性,配置SSL证书是必不可少的一环,本文将详细介绍如何在Nginx中为PHP开发环境配置SSL证书,包括证书获取、Nginx配置、PHP相关设置以及常见问题的解决方案。

获取SSL证书
在配置SSL证书之前,首先需要获取有效的证书,SSL证书可以通过以下几种方式获得:
-
免费证书:Let's Encrypt提供免费的SSL证书,自动化的证书管理工具Certbot可以简化申请和续期过程,适合个人项目或小型网站,证书有效期为90天,需要定期续期。
-
付费证书:如DigiCert、Sectigo等商业证书颁发机构(CA)提供的证书,通常支持更高的安全级别和更长的有效期,适合企业级应用。
-
自签名证书:仅用于开发和测试环境,不会受浏览器信任,但可以加密本地开发环境中的数据传输。
获取证书后,通常会得到两个文件:证书文件(如domain.crt)和私钥文件(如domain.key),确保私钥文件的安全,避免泄露。
Nginx配置SSL证书
Nginx配置SSL证书主要通过修改nginx.conf或站点的配置文件实现,以下是详细的配置步骤:
基本SSL配置
在Nginx配置文件中,使用server块定义SSL监听和证书路径,以下是一个示例配置:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/yourdomain.crt;
ssl_certificate_key /path/to/yourdomain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
强制HTTPS访问
为确保所有流量都通过HTTPS传输,可以配置HTTP请求自动重定向到HTTPS:

server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
优化SSL性能
通过调整SSL相关参数可以提高性能,例如启用会话缓存和OCSP装订:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on;
PHP相关设置
配置SSL后,PHP应用可能需要调整以支持HTTPS,以下是几个关键点:
-
获取HTTPS协议信息:PHP中可以通过
$_SERVER['HTTPS']或$_SERVER['SERVER_PORT']判断是否为HTTPS连接,确保应用正确处理这些变量。 -
Cookie安全设置:在PHP中设置Cookie时,启用
Secure和HttpOnly标志,确保Cookie仅通过HTTPS传输且不可被JavaScript访问:
setcookie("name", "value", [
'expires' => time() + 86400,
'path' => '/',
'domain' => 'yourdomain.com',
'secure' => true,
'httponly' => true
]);
- PHP-FPM配置:确保PHP-FPM的监听地址和权限与Nginx配置匹配,避免权限问题导致PHP无法执行。
测试与验证
配置完成后,需要验证SSL是否正确生效:
-
浏览器检查:访问
https://yourdomain.com,查看浏览器地址栏是否显示安全锁图标,点击图标可以查看证书详情。 -
命令行工具:使用
openssl命令测试SSL连接:openssl s_client -connect yourdomain.com:443
检查输出中的证书链和协议版本。

-
在线工具:使用SSL Labs的SSL Test工具(https://www.ssllabs.com/ssltest/)全面评估SSL配置的安全性和性能。
常见问题与解决方案
-
证书链不完整:某些CA会提供中间证书,需要将中间证书与服务器证书合并为一个文件,并在
ssl_certificate中指定合并后的文件路径。 -
警告:如果页面中通过HTTP加载了资源(如图片、脚本),浏览器会显示混合内容警告,确保所有资源都通过HTTPS加载,或使用相对路径避免硬编码HTTP URL。
FAQs
Q1: 如何自动续期Let's Encrypt证书?
A1: 使用Certbot可以自动续期证书,运行certbot renew --dry-run测试续期功能,然后添加定时任务(如cron job)定期执行certbot renew,默认情况下,Certbot会在证书过期前30天自动续期。
Q2: 配置SSL后,PHP应用中如何获取当前请求是否为HTTPS?
A2: 在PHP中,可以通过检查$_SERVER['HTTPS']变量是否为on,或者$_SERVER['SERVER_PORT']是否为443来判断。
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;