在之前兩篇文章《Docker初學到實戰》和《Jenkins自動化部署》中,我騰訊云的微輕量服務器上安裝的是CentOS(8.x版本)系統,在這個系統中安裝了以Docker服務,并以容器化的方式搭建了網站《短鏈接轉換 (freetiny.link)》,還通過Jenkins實作了CICD,
但是在之前的文章中,所有的服務都是用的IP地址訪問,并沒有用到域名,如果想要正式的把網站發布出去用,還需要完成域名的申請、域名的決議和SSL證書的配置,
所以我說一下我的前置條件和需求:
前置條件:
1.我已經開發并部署好了8個服務,
2.我已經申請好了兩個域名(freetiny.link)和(flt.fit),原本只需要一個域名就夠的,但是因為我網站的類容是短鏈接轉換,所以轉換出來的短鏈接域名越短越好,所以flt.fit域名作為轉換后的域名,也就是我的后端API域名,freetiny.link作為網站域名,以及其他服務的域名(如阿波羅配置、Jenkins等等),
我的需求:
因為我只有騰訊云上1臺輕量服務器,我的所有服務都在這個上面,但是域名決議時http只能決議到80埠,https的訪問只能決議到443埠,此時,我需要在不同域名訪問時把不同的域名分發到不同的埠,這樣才能指向我不同的服務,
我的分析:
首先,如果需要反向代理,域名分發那么使用nginx無疑是最好的方案,所以我需要先要搭建一個nginx的服務,并且根據在nginx上配置SLL證書,以及不同域名分發到不同埠進行訪問,
但是,在我實踐的程序中遇到了一個問題,nginx安裝在何處比較簡單方便?是用docker安裝在容器中,還是直接安裝在宿主機上面(也就是我的騰訊輕量服務器):
最終,結合我的環境,因為我只有一臺服務器,在這服務器上裝了docker,我的所有都是以容器化的方式運行在這個宿主機上的,因為以下種種原因,最后我還是決定把nginx安裝在了宿主機上,以下是我的原因:
其實一開始我是把nginx以容器的方式運行在docker中的,與我的其他業務服務在同一個docker環境中,最終的結果就是,nginx監聽80或443埠,然后分發到我的各個業務容器服務中,可因為nginx與其他服務是并列在docker的虛擬網路中的,所以分發時在nginx的組態檔中配置的地址和埠就是docker的虛擬網路IP和埠,好了,問題來了,因為docker容器在每次啟動的時候IP地址是會動態變化的,那么就需要固定各個容器的IP地址,固定IP地址需要自己去在docker中建立一個自定義的network,如果是這樣,那么會有一下幾個不爽的地方:
1.因為我玩這個docker還不夠熟練,不想冒然的去玩docker的network這個東西,而且據我同事說這事兒有時候還會出行一些莫名其妙的網路問題,比如容器中訪問不到與宿主機平行的其他主機之類的,
2.在修改Nginx的組態檔時需要關注容服務的IP地址,排查問題時需要核對nginx的IP和容器IP,
3.如果docker服務掛掉,所有容器都將不能訪問,那么客戶訪問網站時,連404頁面都無法顯示,
4.在安裝nginx時還需要掛載目錄,防止組態檔丟失,多一些操作步驟,
5.需要為之前的服務都手動分配一個IP,添加了容器的自定義network后,在新增容器時也是要注意是否需要選自定義的這個網路,需要的話還是得手動分配一個IP,如果忘記了就出問題了,
6.如果docker服務出問題了,網站就全面崩潰,連一個404頁面都無法反饋給用戶,
最終想到上面這堆麻煩的問題,拍拍手還是把Nginx安裝在宿主機器上吧,如果這樣,nginx轉發時就不用關心IP地址了,容器也不用關心IP地址了,只需要關注埠就行,
兩種方案的對比圖如下:

(方案一:nginx以容器運行)

(方案二:nginx在宿主機運行)
當然兩種方案都能實作,只是我選擇了方便的方案二,
教程其實很簡單,就是兩步,先安裝nginx然后修改nginx的組態檔,主要重點也在組態檔上,要弄明白組態檔的意思,
一、安裝nginx到宿主機上
在centOS(8.x版本以上)上安裝nginx比較簡單,可以直接用yum命令安裝:
sudo yum install nginx //安裝ngxin
systemctl start nginx //啟動nginx
systemctl status nginx //查詢nginx服務當前狀態
systemctl start nginx //把nginx加入開機啟動
systemctl reload nginx //重啟nginx,修改組態檔是需要使用到
如果centOS不是8版本以上的,安裝要稍微復雜一些,可以參考其他資料,
二、修改nginx組態檔
我用的是WinSCP軟體連接到宿主機上,然后找到組態檔的目錄,默認安裝目錄在:/etc/nginx/nginx.conf


上圖這段代碼就是我的配置,大家可以參考一下(完整代碼在最后),至于上圖中SSL證書有很多的配置項,有一部分沒有注釋,那是因為我從騰訊云的教程手冊中Copy過來的,我也不明白具體什么意思,不過從單詞上可以大概了解,
配置上面的內容是,涉及到以下幾個方面:
1.配置了SSL時,要把自己申請的對應域名的ssl證書檔案拷貝到宿主機上,如下圖:

2.域名決議時,因為我用了多個二級域名,在騰訊云上需要把每個二級域名都決議到宿主機:

3.在宿主機的防火墻設定中把以前用使用IP地址訪問時的一些埠關閉掉,只開放nginx監聽的80和443埠,當然我還保留了3306,方便我在本地連接資料庫操作,如果考慮安全問題也可以關掉,只是管理資料庫的時候就比較麻煩,需要在服務器上Web的資料庫管理軟體,通過Web登錄之后來管理:

4.nginx的組態檔每次修改都需要重啟服務才生效:
systemctl reload nginx
按照以上方式全部操作完成后,就大功告成,后續我只需要關心:
域名=>對應的宿主機埠=>對應的Docker容器
也就是我只需要記住nginx中組態檔里各個域名對應的宿主機埠,然后這個宿主機埠又對應的是哪個Docker中的容器,把這個3個地方的埠對應起來記住就OK了,不用去管什么IP地址之類的了,
完整配置代碼如下
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 403;
}
server {
listen 80;
server_name xxxxx.freetiny.link;
location / {
proxy_pass http://127.0.0.1:9000;
}
}
server {
listen 80;
server_name xxxxx.freetiny.link;
location / {
proxy_pass http://127.0.0.1:8070;
}
}
server {
listen 80;
server_name xxxxx.freetiny.link;
location / {
proxy_pass http://127.0.0.1:8090;
}
}
server {
listen 80;
server_name xxxxx.freetiny.link;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name xxxxx.freetiny.link;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
server {
listen 443 ssl;
server_name ftl.fit;
ssl_certificate "/etc/nginx/sslfile/1_ftl.fit_bundle.crt";
ssl_certificate_key "/etc/nginx/sslfile/2_ftl.fit.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;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:81;
}
}
server {
listen 443 ssl;
server_name freetiny.link www.freetiny.link;
ssl_certificate "/etc/nginx/sslfile/1_freetiny.link_bundle.crt";
ssl_certificate_key "/etc/nginx/sslfile/2_freetiny.link.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;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:82;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336208.html
標籤:其他
上一篇:【快速學習系列,圖文并茂】HTTP的GET和POST、Cookie和Session
下一篇:nginx作業原理與配置
