前段時間機房突然通知公司幾個網站都沒備案,在16點之前不關閉網站將直接封服務器ip,一問起來,是以前備案都放在武漢機房,9月份武漢機房撤掉了,結果備案信息都被幹掉了,這都是前人留下的抗,沒辦法,拿方案出來吧,下面有二套方案:
方案一:做dns cname 到已備案的二級域名
方案二:轉移到其他機房做301跳轉或者代理,讓原域名和已備案的二級域名都可以訪問網站,雙保險
首先施行方案一,簡單說說思路,其實就是將未備案的域名cname到已備案的二級域名上面,做法很簡單,只需要修改dns指向即可,如圖:
例如:
未備案的域名:test.com
已備案的域名:abc.com
更改DNS記錄,選取yeyou.abc.com作爲臨時域名,在test.com域名裏面做如下更改:
test.com cname yeyou.abc.com
在abc.com域名需要添加yeyou.abc.com這個二級域名,並將這個域名指向到原服務器。
按照這個思路做好了,理論上現在未備案域名test.com的根指向的是yeyou.abc.com,這個是備案了的,
這樣訪問www.test.com會自動的去訪問yeyou.abc.com這個二級域名對應的服務器,按道理來說,這樣可以正常訪問www.test.com,也不存在備案問題了,因爲yeyou.abc.com這個備案了的,也就是在dns這一層就做了跳轉,但是機房太二了,非得我這個test.com域名不能指向他們的服務器,上面的yeyou.abc.com指向的仍然是他們的服務器,由於代碼不可能在半天之類全部修改完,網站有支付功能,所以接口、回調鏈接很多,機房要求那邊ping test.com指向的ip不是他們的服務器,只能用方案二了。
最好找一臺國外的vps,只要對國內訪問速度可以就行了,然後做301跳轉,如下圖:
將test.com A記錄指向到國外的vps,yeyou.abc.com A記錄指向到原服務器,在vps上面做nginx 301跳轉到yeyou.abc.com這個域名,最終用戶訪問的還是原服務器,這樣可以避免test.com未備案而被封的問題,程序也不需要做很大的改動,vps nginx配置如下:
server { listen 80; server_name test.com www.test.com api.test.com cps.test.com ; if ($host = 'www.test.com'){ rewrite ^/(.*)$ http://yeyou.abc.com/$1 permanent; } if ($host = 'api.test.com'){ rewrite ^/(.*)$ http://api.yeyou.abc.com/$1 permanent; } if ($host = 'cps.test.com'){ rewrite ^/(.*)$ http://cps.yeyou.abc.com/$1 permanent; } }
原nginx的配置就很簡單了,只需要將server_name www.test.com更換爲yeyou.abc.com;即可,其他的都不用更改。用戶訪問的過程,如下圖 :
國外vps只起一箇中間過渡,可以在nginx日誌裏面看到狀態碼是301,將一部分老用戶訪問test.com轉移到新域名yeyou.265g.com上。
但是有個問題,所有訪問www.test.com的用戶會被自動跳轉到yeyou.abc.com,這樣感覺很不爽,最後修改成了反向代理,用戶訪問域名不變,仍然會跳轉到原服務器,具體做法:
vps配置如下:
server { listen 80; server_name www.test.com; access_log logs/www.test.access.log main; ssi on; proxy_redirect off; 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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; location ^~ / { # proxy_cache abc_cache; proxy_set_header Host yeyou.abc.com; #注意要指定跳轉的域名,否則會無法跳轉,出現502 rewrite ^(.*)$ /$1 break; proxy_pass http://yeyou.abc.com; #本地服務器要能解析這個域名 } }
原服務器nginx配置更上面一樣,只需要將server_name 指向yeyou.abc.com即可,這樣用戶訪問的過程,如下圖:
可以在nginx日誌裏面看到狀態碼是200,當用戶去訪問www.test.com,vps會自動將test.com轉換成yeyou.abc.com來提供用戶訪問,這樣對用戶的體驗來說是很好的,在瀏覽器中不會跳轉到yeyou.abc.com,用戶還是用test.com去訪問網站,對用戶來說是透明的。
遇到的問題:
常用的nginx反向代理與上面反向代理的區別?
常用的nginx反向代理配置:
## Basic reverse proxy server ## ## Apache backend for www.quancha.cn ## upstream apachephp { server ip:8080; #Apache } ## Start www.quancha.cn ## server { listen 80; server_name www.quancha.cn; access_log logs/quancha.access.log main; error_log logs/quancha.error.log; root html; index index.html index.htm index.php; ## send request back to apache ## location / { proxy_pass http://apachephp; #Proxy Settings proxy_redirect off; 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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
都是指向後端ip+端口的形式。
上面nginx跳轉URL不變,以域名的形式進行代理。
注意:需要代理服務器能夠解析要代理的域名。
總結:目前在國內,網站如果沒有備案想上線的話,也只能這麼做了,寫下來留着以後參考用。