【教程】Nginx开启SNI验证(多域名)

前言

在前一篇文章中,我们讨论了单域名SNI验证的配置方法(传送门),那么,这篇文章我们就来讨论下多域名如何配置sni验证 :cool:

注意事项

开启此功能后,如果你有使用CDN加速的必要,

必须开启CDN的SNI回源!

必须开启CDN的SNI回源!

必须开启CDN的SNI回源!

否则可能会导致各种5xx错误!

 

 

 

如上图,输入你配置的域名即可

安装准备

为了简洁,本篇文章就不放安装方法出来了,详细的安装方法请参见单域名配置文章    :arrow:

配置文件

因为这次讲的是多域名,配置文件相对于单域名有较大改变,并且要启用vhost,所以出错率有可能会比较高,所以各位跟紧步伐辣! :oops:

备注:我的Nginx配置文件目录:/usr/local/nginx/conf(目录位置因机器而异,请查好自己的nginx目录位置!:neutral:

第一步,也是先进入配置文件夹

cd /usr/local/nginx/conf 
ls #查看一下有没有vhost文件夹?
sudo mkdir vhost #如果没有则创建
sudo vim nginx.conf

在nginx.conf最后一个括号前加上:

include vhost/*.conf;
#如果是从单域名过来的同学,则需要在http里面添加,下图是例子:
http
    {
        include       mime.types;
        default_type  application/octet-stream;

        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile on;
        sendfile_max_chunk 512k;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;
#limit_req_zone $binary_remote_addr zone=allips:20m rate=20r/s
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;

              gzip  on;
              gzip_min_length  1k;
              gzip_buffers     4 8k;
              gzip_http_version 1.1;
              gzip_comp_level 4;
              gzip_types text/plain text/css application/json image/png image/x-icon application/javascript application/x-javascript text/javascript text/xml application/xml application/xml+rss text/cache-manifest application/octet-stream;
              gzip_vary on;
        #limit_conn_zone $binary_remote_addr zone=perip:10m;
        ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.

        server_tokens off;
        access_log off;
include vhost/*.conf;#在这里加,上面不用管,这只是个例子
}
#############################################################3

#最后:wq保存并退出

进入vhost文件夹

cd vhost

新建vhost配置文件:

sudo vim cannon.org.cn.conf #将cannon.org.cn改为你的主域名

配置如下:

server
    {
        listen 80;
        listen [::]:80  ipv6only=on;
        server_name cannon.org.cn;#把cannon.org.cn改为你的主域名
        return 444
        include enable-php.conf;
              
}

server {
    listen 444 ssl;
    listen [::]:444 ipv6only=on;
    server_name cannon.org.cn;#把cannon.org.cn改为你的主域名
    ssl on;
    ssl_certificate  /usr/local/nginx/conf/ssl/cannon.org.cn_ssl.crt;
#同下
    ssl_certificate_key /usr/local/nginx/conf/ssl/cannon.org.cn_ssl.key;
#改为你自己的SSL证书
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
        root  /home/wwwroot/default;
        index  index.php index.html index.htm;
            
        if (-f $request_filename/index.html){
               rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
               rewrite (.*) $1/index.php;
         }
        if (!-f $request_filename){
               rewrite (.*) /index.php;
         }
        #error_page   404   /404.html;
        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
        include enable-php.conf;
        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
        location ~ /.well-known {
            allow all;
        }
        location ~ /\.
        {
            deny all;
        }
        access_log  /home/wwwlogs/access.log;
}

输入:wq,退出并保存,并执行sudo nginx -t看看有木有报错 :grin:

这样子,第一个域名就配置好啦,然后我们开始配置第二个域名(可选)

新建第二个配置文件:

sudo vim blog.cannon.org.cn.conf #将blog.cannon.org.cn.conf改为你想添加的第二个域名

第二个域名配置如下:

server
    {
        #listen 80;
        #listen [::]:80  ipv6only=on;
        #第二个域名不能继续监听80,否则会报错(好迷)
        server_name blog.cannon.org.cn;
#将blog.cannon.org.cn改为你要添加的第二个域名
        return 444;
        include enable-php.conf;
}
server
    {
        listen 444;
        #listen [::]:444 ipv6only=on;第二个域名也不能监听v6
        server_name blog.cannon.org.cn;
#将blog.cannon.org.cn改为你要添加的第二个域名
        #error_page   404   /404.html;
        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
        include enable-php.conf;
        ssl_certificate  /usr/local/nginx/conf/ssl/blog.cannon.org.cn.pem;
#改为你自己的SSL证书
            ssl_certificate_key /usr/local/nginx/conf/ssl/blog.cannon.org.cn.key;
#改为你自己的SSL证书

    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
        root  /home/wwwroot/default;
        index  index.php index.html index.htm;
            
        if (-f $request_filename/index.html){
               rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
               rewrite (.*) $1/index.php;
         }
        if (!-f $request_filename){
               rewrite (.*) /index.php;
         }
        #error_page   404   /404.html;
        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
        include enable-php.conf;
        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
        location ~ /.well-known {
            allow all;
        }
        location ~ /\.
        {
            deny all;
        }
        access_log  /home/wwwlogs/access.log;

}

输入:wq,退出并保存

返回conf文件夹:

cd ..

修改nginx.conf文件

sudo vim nginx.conf

(单域名过来的童鞋可以跳过)  在nginx.conf最后一个括号后面添加 :mrgreen:

stream {
map $ssl_preread_server_name $name { #根据ssl sni name选择策略
    backend.example.com web; #把backend.example.com 改成你的域名
    default block; #只要sni name 不正确就断开连接
	}
upstream web {
    server 127.0.0.1:444; #正常的Web服务
	}

upstream block {
    server 127.0.0.1:80; #用于阻止不合法请求
	}

server {
    listen      443 reuseport; 
    listen [::]:443 reuseport;
    proxy_pass  $name;
    ssl_preread on; #开启ssl_preread
	}
}

接下来就到了最关键的一步啦,不要退出,修改stream{}:

stream {
map $ssl_preread_server_name $name { #根据ssl sni name选择策略
#比如我想对cannon.org.cn开启sni验证,则:
cannon.org.cn web;
#我还想对blog.cannon.org.cn开启sni验证:
blog.cannon.org.cn web;
#以此类推,其他域名的添加方法也是如此
#格式:域名+(空格)web;(别忘记加;)
default block; #只要sni name 不正确就断开连接
}
#下面不需要动
upstream web {
server 127.0.0.1:444; #正常的Web服务
}

upstream block {
server 127.0.0.1:80; #用于阻止不合法请求
}

server {
listen 443 reuseport; 
listen [::]:443 reuseport;
proxy_pass $name;
ssl_preread on; #开启ssl_preread
}
}

然后输入:wq,退出并保存,运行nginx -t进行查错

如没有错误,则可以输入systemctl restart nginx重启啦 :wink:

出现错误的,可以在评论区发上来,我可以帮你康康

:idea:  :razz:

发表评论

电子邮件地址不会被公开。 必填项已用*标注