nginx 配置https,http默認轉https,配置的我差點懷疑人生,要是你懂正則,應該就不會像我一樣繞彎路了

配置這玩意配了兩天,公司網絡卡是一回事,不懂正則又是一回事,最後連後臺支不支持https都懷疑了,差點想用openssl生成個證書給後臺,不過多搜索了一下,還是讓我測通了,分享出來經驗給大夥兒,不明白的評論

首先,不懂nginx 基本東東的童鞋,請花幾分鐘看看nginx的講解,各種參數代表啥意思(我就搞懂了$request_uri 就解決了兩天沒搞出來的問題),還有稍微懂點正則表達式。實在不想搞懂的童鞋,最起碼 rewrite 和 location 要搞懂,然後仿照我這個 nginx 來配置就可以了

想搞懂的童鞋,推薦個連接:

https://segmentfault.com/a/1190000002797606

(ps:裏面有個$ 開頭的各參數舉例,例子有些是錯的,特別是$request_uri,所以不要參考例子,只要知道個參數是幹嘛的就行了,參數講解是沒錯的)

繼續

  • 我的 nginx 配置的前情摘要:
  1. 我有個阿里域名 www.XXX.top,並且申請了證書,可以使用https
  2. 我配置了域名,指向我的阿里雲服務器(windows server 2016)
  3. 我想要訪問這個域名,就可以直接訪問阿里雲的80端口,後通過nginx解析到項目的前端(項目是前後端分離的)
  4. 後端我用的其他端口,但是由於https頁面內不允許http請求,所以我的後端請求也要改成https
  •  我要滿足的需求:
  1. 訪問 www.XXX.top,默認跳轉
    要實現的url跳轉概覽:
    www.XXX.top        --->        https://www.XXX.top/AAA
    www.XXX.top/AAA    --->        https://www.XXX.top/AAA
    www.XXX.top/BBB    --->        https://www.XXX.top/BBB
    這個跳轉滿足兩個需求,a.http轉爲https;b.訪問的域名後面沒加其他東西的時候,默認跳轉到AAA,加了其他東西就跳轉到其他地方,如www.XXX.top/BBB就可以轉到 https://www.XXX.top/BBB。。。。。這裏需要個 if 判斷
  2. 後臺也要通過 https 訪問,原路徑爲 http://xxx.xxx.xxx.xxx:8090/demoService。。原來的用的是ip和端口訪問的http請求
  •  需要準備的東西:

基礎的軟件、後臺的跨域設置、阿里雲服務器域名指向以及端口開放就不用說了

nginx 的https 的配置,在阿里雲裏面有講解,鏈接如下:

https://help.aliyun.com/knowledge_detail/95491.html?spm=a2c4g.11186623.2.9.13974c07MZ9izQ

記得server_name改成自己的,證書路徑什麼的都改成自己的,可參考: 

https://blog.csdn.net/limingyue0312/article/details/79678869

 

還有個問題,如果你的服務器80端口被佔用了,一定要先找出來幹掉【心裏頭的疙瘩,不幹掉不爽】,像我的雲服務器,就莫名有個sqlserver的服務,佔用了80端口,找了好幾次才找出來,要掌握命令行這些找端口的命令:

  1. 找到pid,最後一列就是:netstat -ano | findstr "80"
  2. 通過找到的pid,查找任務進程誰佔用了:tasklist|findstr ""【引號裏放pid】
  3. 找到任務的進程id,去任務管理器裏找是哪位,然後去服務裏找到它,幹掉,把啓動屬性選成手動啓動以絕後患。

 

  •  需要理解的例子:

如:

 http://localhost:8888/test1/test2/test.php?param1='aaa'
$host:localhost
$server_port:8888
$request_uri:/test1/test2/test.php?param1='aaa'
$document_uri:/test1/test2/test.php   【和$uri 一樣】

 

常用nginx 命令:【管理員身份命令行,跳到根目錄(有nginx.exe 的目錄)】

 啓動:start nginx.exe

進程結束後停止(可記錄日誌,有時候會很慢):nginx -s quit

強行終止(不記錄日誌):nginx -s stop

檢查配置文件(配置文件寫好後要用這個驗證,通過後再啓動,不然白搭):nginx -t

 

好了,可以上配置文件了,具體的說明,配置文件裏都有:


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
	worker_connections  1024;
}


http {
	include       mime.types;
	default_type  application/octet-stream;
	charset utf-8;
	#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	#                  '$status $body_bytes_sent "$http_referer" '
	#                  '"$http_user_agent" "$http_x_forwarded_for"';

	#access_log  logs/access.log  main;

	sendfile        on;
	#tcp_nopush     on;

	keepalive_timeout  65;
	
#	gzip  on;
#	gzip_min_length 1k;
#	gzip_buffers 4 16k;
#	gzip_http_version 1.0;
#	gzip_comp_level 2;
#	gzip_types text/plain application/x-javascript text/cssapplication/xml;
#	gzip_vary on;


	#配置虛擬主機
	server {
		#監聽80端口
		listen       80;
		#你的域名,沒有域名就寫服務器ip就可以
		server_name  www.demo.top demo.top;
		#這裏判斷request_uri 是否是空的【就是指host和端口號後面的所有東東(包括參數)】
		#注意,即使是空的,也會有個 / 斜槓,所以要判斷是否等於 / 
		if ( $request_uri != '/'){
		#!!!!大坑,if 後面一定要有空格,括號前後也是,就是要隔開,不然nginx -t 報錯,,,另外,沒有else 只有if
			rewrite ^/(.*) https://$server_name$request_uri? permanent;
		}
		#前面驗證通過,後面就不會走了,因爲跳到了https鏈接,會進下文配置的https接收裏
		rewrite ^/(.*) https://www.demo.top/AAA;
		
		location / {
			root   html;
			index  index.html index.htm;
		}
		#	錯誤頁重定向
		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
			root   html;
		}
	}


#	#server裏可以配置的其他東東參考,不要直接放開使用,按需拿到上面的server裏用
#	server{
##下面的 是要寫在server裏的,按需使用
#		access_log  logs/host.access.log  main;
#		location / {
#			#域名www.test.com的請求全部轉發到這裏的服務器上
#			proxy_pass http://back_server1;
#		  proxy_set_header Host $host;
#		  proxy_set_header X-Real-Ip $remote_addr;
#		  proxy_set_header X-Forwarded-For $remote_addr;
#		  #歡迎頁面,按照從左到右的順序查找頁面
#		  index index.html index.htm front.html
#		}
#		
#		location ~ \.php$ {
#			proxy_pass   http://127.0.0.1;
#		}
#	
#		location ~ \.php$ {
#			root           html;
#			fastcgi_pass   127.0.0.1:9000;
#			fastcgi_index  index.php;
#			fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#			include        fastcgi_params;
#		}
#	
#		location ~ /\.ht {
#			deny  all;
#		}
#	}	
	
	
	#配置一個跳轉,可在proxy_pass裏使用
	upstream demoService{
        #你服務器的IP地址和後臺的服務的端口
		server xx.xx.xx.xx:8090;
	}

	# 配置 HTTPS server
	server {
		listen       443 ssl;#設置爲on啓用SSL功能。
		server_name  www.demo.top demo.top;# localhost修改爲您證書綁定的域名。多個域名中間加空格

		ssl_certificate      ../cert/1775271_www.demo.top.pem;
		ssl_certificate_key  ../cert/1775271_www.demo.top.key;

		#下面的東東是阿里雲裏的,就不深究了
		ssl_session_cache    shared:SSL:1m;#緩存大小
		ssl_session_timeout  5m;#超時時間
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #修改protocols。
		ssl_prefer_server_ciphers  on;

		#默認文件夾,項目在哪裏你就寫哪裏,不然就要輸入域名的時候自己在後面加文件夾名字
		#這裏html指的是nginx的文件夾,如果在html文件夾裏新建個test文件夾,這裏就可以直接寫root html/test 就能直接指向test裏的index了
		location / {
			root   html;
			index  index.html index.htm;
		}
		#這裏匹配域名host後面的第一個東東,用這個可以區分訪問的是後臺,比如訪問後臺是ip:port/demoService,這裏區分demoService,就可以指向不同的端口了
		location /demoService/ {
			#允許的來源,自己後臺跨域怎麼設置的就自己設置,不設置也行,這裏寫域名
			add_header         'Access-Control-Allow-Origin' 'https://www.demo.top';
			#設置爲true,允許ajax異步請求帶cookie信息
			add_header         "Access-Control-Allow-Credentials" "true";
			#設置爲x-requested-with,content-type,允許ajax餘部請求。
			add_header         "Access-Control-Allow-Headers" "x-requested-with,content-type";
			#要跳轉的地方,這裏跳轉到訪問8090端口,也就是說端口號後面第一個目錄是demoService的,都去訪問8090後臺端口
			proxy_pass http://demoService;
			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;
			client_max_body_size 1024m;
			proxy_connect_timeout 600;
			proxy_read_timeout 600;
			proxy_send_timeout 600;
			proxy_buffering on;
			proxy_buffer_size 64k;
			proxy_buffers 8 1m;
			proxy_busy_buffers_size 2m;
			#proxy_temp_file_write_size 0;
		}
	}
	

}

 

結束,如有疑問,請評論區討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章