你如果說(shuō)站在一個(gè)黑客(ke)的何實(shí)角??度來(lái)看,域名要不要問(wèn)題不大,器域??因為ping一下基本就出來(lái)了。名綁確實(shí),定服但是綁定我們寫(xiě)的網(wǎng)站都是面向用戶(hù)的,如果你這兒直接是域名個(gè)ip用戶(hù)多少會(huì )覺(jué)得怪異。于是分享本著(zhù)強迫癥的心里,我花了大概一天的教程時(shí)間反復對著(zhù)服務(wù)器鞭(°□°)尸,終??于找了解決問(wèn)題的何實(shí)關(guān)鍵—— nginヽ(′▽?zhuān)?ノx。
你如果有時(shí)間可以看看我這個(gè)探索的過(guò)程,時(shí)間緊迫可以直接跳過(guò)。名??綁看了好多文(╯‵□′)╯章發(fā)現問(wèn)題的定服根本還是這(′ω`*)個(gè)ng(O_O)inx的配置不太明白,于是綁定想了個(gè)方法,在寶塔面板里面有nginx的域名配置方法,用的分享是GUI,點(diǎn)(dian)兩下就行,只要找到對應的nginx的conf配置文件文件就行:
首先用GUI配置一下https域名訪(fǎng)問(wèn):
開(kāi)啟訪(fǎng)問(wèn)如下:
好的現在域名https(′?ω?`)解析配置好了:
接下來(lái)(???)就是分析:
接下來(lái)可能你想說(shuō),懂了,那我就在do??cker里面搞一個(gè)ng?inx,然后將這個(gè)nginx的配置文件給復制進(jìn)去,建立相關(guān)的文件夾,然后把需要用到的ssl的公鑰和私鑰以及必要的日志打印文件給建好,畢竟在沒(méi)有寶塔面板的情況下配個(gè)域(yu)名和https訪(fǎng)問(wèn)(wen)也不至于不能實(shí)現。雖然過(guò)程可能有(you)些痛苦,但理論上可行。很遺憾地告(╬?益?)訴你,這其實(shí)是(?????)一個(gè)錯誤的思路, 除了過(guò)于復雜外,還違背了docker的初衷。
其實(shí),是有更好的解決方法的,ヽ(′ー`)ノ雖然容器與服務(wù)器主機之間貌似沒(méi)有多余的交互,除了一個(gè)端口映射外,其實(shí)是可以使用文件映射的。因為這篇主要是針對應用的,所以很多理論知識就先不談。其實(shí)是可以將我們下載的nginx的配??(??-)?置文件直接映射到使用服務(wù)器主機上的nginx的配置文件。之所以使用docker,主要還是防止版本等的沖突造成項目部署出現“奇奇怪怪”的問(wèn)題。但是即使軟件(nginx)更新了,軟件也(ye)不(bu)至于會(huì )影響前一個(gè)版本的配置(使用方式)。一般情況下,都是提高軟件本身的性能和穩定性。
按照上(′?ω?`)面的這個(gè)方法,就需要首先找到nginx在服務(wù)上的配置文件的具體(??-)?位置了。找的(de)話(huà)比較好找,(′;д;`)進(jìn)入nginx軟件(jian)下面找nginx.conf文件就行:
咱也不多說(shuō)了,這里存在最大的問(wèn)題是,直接將nginx文件映射之后,由于我服務(wù)器使用的centos鏡像,docker里面由于考慮到??輕量化,只保留了核心(xin),很多輔助功能被拋棄了,也就導致了存在服務(wù)器文件和docker容器的Linux文件不ヽ(′▽?zhuān)?ノ匹配,簡(jiǎn)單來(lái)說(shuō)就是一個(gè)容器其實(shí)運行在一個(gè)(ge)輕量化的Linux環(huán)境中,你把服務(wù)器中的配置文件(╬?益?)復制進(jìn)去之后,配置(′?_?`)文件可能還有相互引入,這樣換了環(huán)境直接寄,根本找不到引入的文件。你可能想說(shuō)我都引入,十分復雜。所以,還是得搞明白nginx在網(wǎng)站運行時(shí)到底干了些什么。
如果你的時(shí)間?充裕,推薦去看一下 B站狂神說(shuō)(shuo)給的40分鐘左右的教程,開(kāi)個(gè)(ge)倍速了解一下比較快,通俗易懂。簡(jiǎn)單來(lái)說(shuō) nginx基于C語(yǔ)言開(kāi)發(fā),速度快,支持5萬(wàn)并發(fā)(Tomcat不到1000),可以用來(lái)配置負載均衡、反??向代理、動(dòng)靜結合。我的理解如下:
(1)負載均衡:由于網(wǎng)絡(luò )用戶(hù)逐漸龐大,因此很多廠(chǎng)商實(shí)際使用多臺服務(wù)器,nginx充當服務(wù)器??的代理,將流量按照需要“平均分配”??(有時(shí)候需要結合不同服務(wù)器的性能給不同權重)給這些服務(wù)器。對??于session不同服務(wù)器的共享,雖然這??個(gè)代理能插一手,但是由于性能等原因一般還是選擇使用redis;
(2)反向代理:首先要明白正向代理,正向代理指代理在(zai)客戶(hù)端出現,“健康上網(wǎng)”就是一種(′ω`)(前端的代理也算),反向代理指的是在服務(wù)器上面代理,服務(wù)器為了提高性能(neng)讓別人幫著(zhù)處理;也正是代理的強大,所以高并發(fā)通常會(huì )有他的影子,可以不斷地延伸(°o°),利用多個(gè)子級nginx將流量壓力給抵消掉,也就是構建一個(gè)服務(wù)器集群。
(3)動(dòng)靜結合:其實(shí)就是靜態(tài)資源緩存在nginx這樣就不用再( ?° ?? ?°)去服務(wù)器請求了,因為這個(gè)很經(jīng)打,這樣能夠減少站在它后面瑟瑟發(fā)(fa)抖的服務(wù)器的壓力。
這里貼一篇講??得(de)比較完整的文章吧:超級詳細的nginx講解
為了方便更好地說(shuō)明問(wèn)題,我這里重新做人,把服務(wù)器上面的nginx先給卸載了:
首先,為了安全起見(jiàn),先隨便開(kāi)一個(gè)容器,將容器里面的nginx相關(guān)文件(jian)從(cong)容器復制到服務(wù)器中:
docker run --??name=nginx -d -p 80:80 nginx在服務(wù)器中創(chuàng )建用來(lái)映射的文件目錄,文件映射最好是使用文件夾,因為后面我們可能需要在原映射的基礎上新增其他配置,使用文件能夠提高擴展性,官方也是這么推薦的:
mkdir -p /data/nginx將阿里云中的文件導出用于備份(防??止文件缺損)( cp 容器名:容器中的路徑 備份出來(lái)的服務(wù)器路徑):
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/nginx.conf docker cp nginx:/etc/nginx/conf.d/ /data/nginx?????/ docker cp?? nginx:/usr/share/nginx/html/ /data/nginx/ doc??ker cp ng(′?`)inx??:/var/log/nginx/ /data/nginx/為了由于緩存產(chǎn)生不必要的誤會(huì ),我這里直接換瀏覽器訪(fǎng)問(wèn),確保nginx能夠正常使用(也就是我們拷貝出來(lái)的文件有效):
接下來(lái)就是比較關(guān)??鍵的一步了,刪除容器,利用服務(wù)器??上面的文件重新構建文件映射關(guān)系(′?`*):
dock(°ロ°) !er run --nam(′ω`)e=nginx -d -p 80:80-p 443ヾ(′?`)?:443-v /data/nginx/html:/usr/share/nginx/html -v /data/nginx/nginx.conf:/etc/nginx??/??nginx.conf -v /data/nginx/conf.d/:/?etc/ngin(′?ω?`)x/conf.d/ -v /data/ng(′?`)inx/nginx/:/var/log/nginx/nginx
對上面的指令做出如下???幾點(diǎn)解釋?zhuān)?/span>
(2) -d,nginx是后臺代理,需要長(cháng)期運行;
(3) -v
/data??/n(′?`)ginx/html:/usr/share/nginx/html映射nginx的 html頁(yè)面((′?`*)主要是默認頁(yè)和報(′?ω?`)錯頁(yè));
(4) -v
/data/nginx/co???nf/nginx.conf:/etc/nginx/nginx.conf,映射niginx的配置頁(yè);
(6) -v
/data/nginx/logs:/var/log/nginx,映射nginx的日志文件。
最終??得到的效果??如下:
接下來(lái),簡(jiǎn)單說(shuō)一下nginx的配置文件的意思:
usernginx; #指定系統用戶(hù),這里使用的是ngi??nx創(chuàng )建的用戶(hù)組worker_processesauto;#定義nginx對外提供web服務(wù)時(shí)的進(jìn)程數error_log/var/log/nginx/eヾ(′?`)?rror.log notice;#錯誤日志信息存儲位置pid/var/run/nginx.pid;#進(jìn)程控制塊even(′?_?`)ts{ worker_connections1024;#進(jìn)程同時(shí)打??開(kāi)的最大連接數} http{ include/etc/nginx/mime.types;#支持的類(lèi)型,這個(gè)可以聯(lián)想一下nodeJS里面的那(⊙_⊙)個(gè)第三方依賴(lài)default_typeapplication/octet-stream;#默認類(lèi)型log_formatma(′?`*)in '$remote_addr- $remote_user[$time_l??ocal] "$request" ''$status$body_bytes_sent"$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#日志格式access_log/var/log/nginx/access.log main;#訪(fǎng)問(wèn)日志sendfileon;#開(kāi)啟文件發(fā)送功能#tcp_nopush on;keepalive_timeout65;#長(cháng)連接過(guò)期時(shí)間#gzip on;include/??etc/ngi??nx/conf.d/*.conf;#這個(gè)非常重要,引入conf.d下面的全部.conf后綴的配置文件}官方給了一個(gè)默認的配置文件( default.conf):
server{ listen80; listen[::]:80; server_namelocalhost; location/ { #這里其實(shí)是一個(gè)攔截器root/usr/share/nginx/html; #站點(diǎn)位置,這里需要使用容器里面的路徑而不是服務(wù)器,??因為最終容器(′?`*)環(huán)境對因為L(cháng)inux環(huán)境indexindex.html index.htm; #知道php應該的都懂,這里是默認展示的頁(yè)面配置} #報錯頁(yè)面處理error_page500502503504/50x.html; location= /50x.html { roo??t/usr/share/nginx/html; } }好嘞,咱接下來(lái)(//ω//)直接配置域名訪(fǎng)問(wèn)。如果你之前也是使用的寶塔面板,那么恭喜你,你只需要把阿里云證書(shū)文件夾( cert)找到復制到 /data/nginx/conf.d目錄下(為什么放在這兒?因為這個(gè)映射的時(shí)候使用的是目錄,而且挨著(zhù)配置文件最近,方便修改),如果不是的話(huà)你得去阿??里云重新下載,然后新建文件夾,把證書(shū)放進(jìn)去,也不難的:
這里把修改之后的文件放在下面供大家參考(基本上你只需要 修改域名和域名對應的證書(shū),因為我這里其實(shí)沒(méi)有部署任何站點(diǎn),特別強調證書(shū)的路徑是 /etc/nginx/conf.d??,不是 /data/nginx/conf.d,容器最終跑的位置??是在docker提供的Linux環(huán)境中)??:
server{ listen80; listen443ssl http2; server_namenightowl.to(??-)?p(╬ ò﹏ó); location/ { root(◎_◎;)/usr/share/nginx/html; indexin(′ω`*)dex.html index.htm; } if($server_port!~ 443){ rewrite^(/.*)$https://$host$1permanent; } ssl_certificate/etc/nginx/conf.d/cert/nightowl.top/(′?`)fullchain.pem; ssl_certifi??cate_(???)key/etc/nginx/conf.d/cert/nighto??wl.top/privkey.(′?`*)pem; ssl_protocolsTLSv1.2TLSv1.3; ssl_ciphersEECDH+CHACHA20:EECDH+CHACH??A20-draft:EECDH+AES128:RS(′?_?`)A+AES128:EECDH+AES2??56:R??SA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphersoff; ssl_session_cacheshared:SSL:10mヽ(′▽?zhuān)?/; ssl_session_timeout10m; add_headerStrict-Trans(╯‵□′)╯port-Security "max-a(╯‵□′)╯ge=31536000"; }誒,跑不了,不保熟是吧?
(1)定制運行docker服務(wù), systemctl stop docker;
(2)在服務(wù)器中找到容器的配置文件, /var/lib/docker/容ヽ(′ー`)ノ器ID/hostconfig.json;
(3)編輯,找到 "PortBindings":{ "80/tcp":[{ "HostIp":"","HostPort":"80"}]]},替換成如下json配置項:
"PortBindings":{ "80/tcp":[{ "HostIp":"","HostPort":"80"}],"443/tcp":[{ "HostIp":"","H??ostPort":"4??43"}]},(4)重啟docker服務(wù), systemctl start docker,然后重新(′▽?zhuān)?運行容器。
成功效果如下:
最后直接快速還賬:
直接給出路由轉發(fā)思路的nginx配置如下:
server{ listen443ssl http2; # lis??tヾ(?■_■)ノen 80;server??_namevisualization.admin.nightowl.top; if($server_port!~ 443){ rewrite^(/.*)$htt(′▽?zhuān)?ps://$host$1perman(′_`)ent; } ssl_c(T_T)ertificate/etc/nginx/???conf.d/cert/visualization.admin.nightowl.topヽ(′?`)ノ/fullchain.pem; ssl_certificate_key/etc/nginx/conf.d/cert/visualization.admin.nightowl.top/privkey.pem; ssl_proto??colsTLSv1.1TLSv1.2TLSv1.3???; ssl_ciphersEECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DE(╬?益?)S??:RSA+3DES:!MD5; ssl_prefer_server_cipherson; ssl_session_cacheshared:SSL:10m; ssl_sessio??n_timeout10m; add_headヾ(′▽?zhuān)??erStrict-Transport-Se(′?`)curity "max-age=31536000"; error_page497https://$host$request_uri; location/ { proxy_passhttp://8.136.14.176:88/; proxy_set_headerHost $host:$server_port; proxy_set??_headerX-Real-IP $remote_addr; proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_headerREMOTE-HOST $remote_addr; add_headerX-Caヽ(′?`)ノche $upstr??eam_cache_status; proxy_connect_timeout30s; proxy_read_timeout86400s; proxy_send_timeout30s; proxy_http_versio???n1.1; proxy_set_headerUpgrade $http_upgrade; proxy_set_headerConnection "upgrade"; } } 版權聲明:本??文內容由互聯(lián)網(wǎng)用戶(hù)自(zi)發(fā)貢獻,該文觀(guān)點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權,不承擔相關(guān)法律責任。如發(fā)現本站有涉嫌抄襲侵權/違法違規的內容, 請發(fā)送郵件至 [email protected] 舉報,一經(jīng)查實(shí),本站將立刻刪除。