Nginx的常見應用

跨域處理

跨域其實是瀏覽器對網站的一種保護機制,具體原理是,瀏覽器不允許通過ajax的方式去加載其他域名下的資源。

跨域主要有兩種解決方案:

  1. 通過jsonp的方式,但是這種方式需要前後端公共協作完成。
  2. 通過cors的方式來解決,這種方式w3c組織制定的一種解決方案。

Nginx主要是通過cors方式來解決的,主要原理是:當發起非本域名下的ajax請求時,瀏覽器會先詢問服務器是否允許該域名下的ajax請求,如果瀏覽器返回可以,那麼這次請求就是被允許的,不會被攔截。

image.png

nginx跨域配置

server {
	listen       80;
	server_name  www.enjoy.com;

	if ( $http_origin ~ http://(.*).enjoy.com){
		set $allow_url $http_origin;
	}
	#是否允許請求帶有驗證信息
	add_header Access-Control-Allow-Credentials true;
	#允許跨域訪問的域名,可以是一個域的列表,也可以是通配符*
	add_header Access-Control-Allow-Origin  $allow_url;
	#允許腳本訪問的返回頭
	add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
	#允許使用的請求方法,以逗號隔開
	add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
	#允許自定義的頭部,以逗號隔開,大小寫不敏感
	add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
	#P3P支持跨域cookie操作
	add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
	add_header test  1;

	location / {
		root   html/static/;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

請求頭

image.png

響應頭

image.png

防盜鏈

使用防盜鏈的主要目的是:讓資源只能在允許的域名下訪問,不能單獨訪問。

原理是通過校驗請求頭中的referer值。valid_referers匹配域名白名單,如果不匹配,把內置變量$invalid_referers置爲1,進入if塊,返回404,Nginx配置:

location ~* \.(gif|jpg|png)$ {
	valid_referers *.enjoy.com;
	if ($invalid_referer) {
		return 404;
	}
	root html/gzip;
}

緩存

其實就是通過expires指定文件的過期時間,Nginx配置:

location ^~ /qq.png {
#	expires 2s; #緩存2秒
	expires 2m; #緩存2分鐘
#	expires 2h; #緩存2小時
#	expires 2d; #緩存2天
	root html/gzip;
}

壓縮

壓縮可以節省帶寬,但是壓縮比較也不能太高,否則會非常耗費CPU,一般通過gzip來實現,Nginx配置:

location ~ /(.*)\.(html|js|css|jpg|jpeg|png|gif)$ {
	# 啓用gzip壓縮,默認是off,不啓用
	gzip on; 
	
	
	# 對js、css、jpg、png、gif格式的文件啓用gzip壓縮功能
	gzip_types application/javascript text/css image/jpeg image/png image/gif;
	# 所壓縮文件的最小值,小於這個的不會壓縮
	gzip_min_length 1024; 
	# 設置壓縮響應的緩衝塊的大小和個數,默認是內存一個頁的大小
	gzip_buffers 4 1k; 
	# 壓縮水平,默認1。取值範圍1-9,取值越大壓縮比率越大,但越耗cpu時間
	gzip_comp_level 1; 
	
	root html/gzip;
}

https

https原理

https其實是http和ssl兩個協議構成,交互流程如下:

image.png

本地生成證書

https證書一般需要購買,自己測試可以在本地生成:

# 1、創建服務器私鑰,命令會讓你輸入一個口令:
openssl genrsa -des3 -out server.key 1024 
# 2、創建簽名請求的證書(CSR):
openssl req -new -key server.key -out server.csr 
# 3、在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令: 
openssl rsa -in server.key -out server_nopass.key 
# 4、最後標記證書使用上述私鑰和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt

Nginx配置

server {
	listen       443 ssl;
	server_name  sales.enjoy.com;

	ssl_certificate		/etc/nginx/conf.d/server.crt; #證書
	ssl_certificate_key     /etc/nginx/conf.d/server_nopass.key;#私鑰

	location / {
		root   html/sales;
		index  welcome.html;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章