1. 程式人生 > >關於Ajax跨域以及Nginx反向代理的一個坑

關於Ajax跨域以及Nginx反向代理的一個坑

之前專案中各種視訊播放出現問題,原因有好多,包括客戶端播放器邏輯,Android系統播放器的坑爹bug,CDN,以及視訊源的壓縮處理不當等等。

然而,關於視訊源壓縮處理,我前段時間樣衰衰,主動提出要搞一套自己伺服器的轉壓工具,代替現有的視訊製作部門使用的“狸窩”~(這個鬼聽名字就知道low爆了)

Anyway,說做就做,進度一拖再拖,從提出到列入專案安排,過了一段時間,等伺服器安排,又等了一段時間,其中的這些等待時間,我並沒有太多地去研究細節,這點需要好好反省,不過關鍵技術點——壓縮轉碼指令碼,倒是很給力地向在某Y工作的初中同學要到了,在這裡需要再次感謝老同學老麥~ 具體程式碼如下:

ffmpeg -y -i #輸入檔案路徑# -profile:v baseline -level 3.0 -map_metadata -1 -c:a copy -b:a 48000 -ar 44100 -c:v libx264 -b:v #視訊位元速率# -s #輸出寬度#:#輸出高度# -flags +loop -preset slower -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709:deblock=1,0 -vsync 0 -pix_fmt yuv420p -g 150 -keyint_min 25 -tune ssim -threads 4 -movflags +faststart #輸出檔案路徑#

ffmpeg -y -i 6554b120ac7744d7a14bc0ad3890e310.mp4 -profile:v baseline -level 3.0 -map_metadata -1 -c:a copy -b:a 48000 -ar 44100 -c:v libx264 -b:v 240000 -s 854:480 -flags +loop -preset slower -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709:deblock=1,0 -vsync 0 -pix_fmt yuv420p -g 150 -keyint_min 25 -tune ssim -threads 4 -movflags +faststart 6554b120ac7744d7a14bc0ad3890e310-transcoded.mp4

核心功能有了,於是就開始做乞丐版,由於只是內部工具,連UI和產品設計都不需要,只需要讓不會寫程式碼的同事們可以無障礙地使用這個指令碼工具即可。

視訊轉碼壓縮效果貌似還和電腦的晶片組有關(因為視訊同事們曾經準備了一臺電腦用來做壓縮轉碼,然而系統一樣,軟體一樣,弄出來的效果就不一樣,居然會有聲音畫面不同步的情況發生)。於是,當然不寫客戶端啦,統一在伺服器解決。這樣,就會有一個需求,讓使用者能訪問並操作伺服器中的轉碼指令碼。最直接的方案當然是Nginx + html css js + 後臺介面 + ffmpeg了。

至於後臺介面,可選擇面非常廣,nodejs,世界上最好的語言,java 等等等等,於是分工給了負責介面的那條hi佬說他java比較熟,於是就選擇了java spring boot 微服務的方式,埠6969.

因為我們的主營專案也一直有版本迭代,所以這個專案就基本上穿擦在主營專案的版本之間的間隙中,加上那條hi佬經常“我都無做哦”。。。進度依然一拖再拖。。不過這只是我的吐槽。

於是最後完成介面,web端也完成,檔案傳輸經過他們這裡不行那裡不行的討論之後決定使用ftp。。。一切就緒,開始做整合測試。

nginx什麼的都已經安裝好了,但是,在呼叫第一個介面的時候我們發現。。同一個伺服器不同埠 = 跨域!!

跨域情況表

很好,之前居然沒想到,那麼處理這個最簡單快捷的方法是什麼呢?當然是Nginx反向代理啦~

於是配置,reload,自信回頭,然後,F♂? 404??

什麼情況?於是開始排查,先看看這個重定向是不是能生效,事實證明,重定向到其他域名是能生效的,到我本機的apache也是可以的,但是到該伺服器的localhost:6969就不行,這是為什麼?? 不過不止localhost:6969不行,到我自己電腦的對應微服務也不行。肯定在這裡出問題,進一步排查。

在這裡中間插一個小插曲,就是使用這一臺機器之前,DBA是分了另一臺開發服給我用的,(為什麼是DBA做IT的工作?不要在意這些細節啦~),同時,他的提議是用測試用的nginx伺服器來做轉發,使用dev域名訪問。perfect!除了訪問這個是用外網,傳輸檔案慢成狗以外沒什麼缺點。。。等等,傳輸檔案慢成翔那用個屁咧!於是才換成了我們現在正在使用的內網伺服器方案,也省去了許多類似登入等安全性的開發。

當時的開發服和nginx弄好以後是能訪問的,但是換成了現在只用一臺伺服器就不行了。看來是這邊的nginx的問題。於是,開開nginx/error.log 一檢視,13: Permission denied) while connecting to upstream 這句報錯非常醒目,一查,原來是centos7的問題,只需要執行 setsebool -P httpd_can_network_connect 1 即可。 done! everything works fine now~

Reference: