一个简单的https server配置
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
几点说明:
- 证书公钥是一个公共文件,会被发送到每一个连接到server的客户端
- 证书私钥为保证安全,需要严格控制访问权限,但是必须可以被nginx master进程访问
- 公钥和私钥也可以放在一个文件里,此时需要控制证书文件的访问控制;虽然公私钥放在一个文件,但是只有公钥会发送给客户端
https server优化
使用https会消耗额外的CPU资源,在多核系统下,nginx工作进程一般不少于可用的CPU核数。使用HTTPS最密集的CPU操作是SSL握手,我们可以从两个方面来减少每个客户端SSL握手的次数:
- 使用 keepalive参数,使几个请求公用一个连接
- 使用ssl_session_cache参数,重用SSL会话参数以避免并行连接和后续连接的SSL握手
worker_processes auto;
http {
# 所有工作线程共享的缓存,1m可以存储4000个session
# 每个共享的缓存应该有一个任意的名字,如这里的SSL
# 具有相同名称的缓存可用于多个虚拟服务器
ssl_session_cache shared:SSL:10m;
# 指定客户端可以重用会话参数的时间,默认是5分钟
ssl_session_timeout 10m;
server {
listen 443 ssl;
server_name www.example.com;
# 服务器保持此连接为打开状态的时间,默认是75s
# 如果为0则禁用保持连接
keepalive_timeout 70;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
同时监听HTTP和HTTPS的配置
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
...
}