快,關注米兜Java,一起漲姿勢~
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
這兩圖這麼一整,估計也很難理解清楚那個是正向代理,那個是反向代理。那我現在詳細解釋一下吧。
正向代理形如1圖,我們在aws上申請首次註冊送12月的服務器,然後它就是我們的VPN了,然後我們通過它就可以訪問YouTube了。不知道大夥能不能明白,正向代理是我們客戶端發起的,客戶端做出調整。
反向代理形如2圖,服務器A,服務器B,服務C部署在內網,我們通過Nginx暴露一個外網地址,小夥伴們就可以訪問我們了。
這麼講不知道能不能解釋清楚,大夥可以繼續看一下下面這個比喻:
正向代理:客戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東。
03Master-Worker模式
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
這兩圖這麼一整,估計也很難理解清楚那個是正向代理,那個是反向代理。那我現在詳細解釋一下吧。
正向代理形如1圖,我們在aws上申請首次註冊送12月的服務器,然後它就是我們的VPN了,然後我們通過它就可以訪問YouTube了。不知道大夥能不能明白,正向代理是我們客戶端發起的,客戶端做出調整。
反向代理形如2圖,服務器A,服務器B,服務C部署在內網,我們通過Nginx暴露一個外網地址,小夥伴們就可以訪問我們了。
這麼講不知道能不能解釋清楚,大夥可以繼續看一下下面這個比喻:
正向代理:客戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東。
03Master-Worker模式
啟動Nginx後,其實就是在80端口啟動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
這兩圖這麼一整,估計也很難理解清楚那個是正向代理,那個是反向代理。那我現在詳細解釋一下吧。
正向代理形如1圖,我們在aws上申請首次註冊送12月的服務器,然後它就是我們的VPN了,然後我們通過它就可以訪問YouTube了。不知道大夥能不能明白,正向代理是我們客戶端發起的,客戶端做出調整。
反向代理形如2圖,服務器A,服務器B,服務C部署在內網,我們通過Nginx暴露一個外網地址,小夥伴們就可以訪問我們了。
這麼講不知道能不能解釋清楚,大夥可以繼續看一下下面這個比喻:
正向代理:客戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東。
03Master-Worker模式
啟動Nginx後,其實就是在80端口啟動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
這兩圖這麼一整,估計也很難理解清楚那個是正向代理,那個是反向代理。那我現在詳細解釋一下吧。
正向代理形如1圖,我們在aws上申請首次註冊送12月的服務器,然後它就是我們的VPN了,然後我們通過它就可以訪問YouTube了。不知道大夥能不能明白,正向代理是我們客戶端發起的,客戶端做出調整。
反向代理形如2圖,服務器A,服務器B,服務C部署在內網,我們通過Nginx暴露一個外網地址,小夥伴們就可以訪問我們了。
這麼講不知道能不能解釋清楚,大夥可以繼續看一下下面這個比喻:
正向代理:客戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東。
03Master-Worker模式
啟動Nginx後,其實就是在80端口啟動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。
1--進程數,建議設置和CPU個數一樣或2倍
2--日誌級別,默認error級別
3--Nginx 啟動後的pid 存放位置
4--配置每個進程的連接數,總的連接數= worker_processes * worker_connections根據物理內存大小來配置,默認1024
Master進程的作用是?
讀取並驗證配置文件nginx.conf;管理worker進程;
Worker進程的作用是?
每一個Worker進程都維護一個線程(避免線程切換),處理連接和請求;注意Worker進程的個數由配置文件決定,一般和CPU個數相關(有利於進程切換),配置幾個就有幾個Worker進程。
由nginx進程圖可以看到,我這邊配了兩個worker_processes,所以有兩個worker進程。
04如何做到高併發下的高效處理?
上文已經提及Nginx的worker進程個數與CPU綁定、worker進程內部包含一個線程高效迴環處理請求,這的確有助於效率,但這是不夠的。
作為專業的程序員,我們可以開一下腦洞:BIO/NIO/AIO、異步/同步、阻塞/非阻塞...
要同時處理那麼多的請求,要知道,有的請求需要發生IO,可能需要很長時間,如果等著它,就會拖慢worker的處理速度。
Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它可以監控多個事件是否準備完畢,如果OK,那麼放入epoll隊列中,這個過程是異步的。worker只需要從epoll隊列循環處理即可。
05如何做到熱部署?
所謂熱部署,就是配置文件nginx.conf修改後,不需要stop Nginx,不需要中斷請求,就能讓配置文件生效!(nginx -s reload 重新加載|nginx -t檢查配置|nginx -s stop 停止nginx)
通過上文我們已經知道worker進程負責處理具體的請求,那麼如果想達到熱部署的效果,可以想象:
方案一:
修改配置文件nginx.conf後,主進程master負責推送給woker進程更新配置信息,woker進程收到信息後,更新進程內部的線程信息。(有點valatile的味道)
方案二:
修改配置文件nginx.conf後,重新生成新的worker進程,當然會以新的配置進行處理請求,而且新的請求必須都交給新的worker進程,至於老的worker進程,等把那些以前的請求處理完畢後,kill掉即可。
Nginx採用的就是方案二來達到熱部署的!
模擬一個例子:
首先在本地模擬一個線上需要升級 Nginx 的環境,假設舊版本為 nginx-1.0.15,需要升級到 nginx-1.16.0。
開始之前,先牢記一下以下幾個命令:
- -HUP 平滑啟動(相當於reload)
- -USR2 平滑升級可執行程序,主要用在版本升級
- -WINCH 從容關閉工作進程
- -USR1 重新打開日誌文件,主要用在日誌切割(相當於reopen)
配置舊版本
# 下載 nginx-1.0.15
wget http://nginx.org/download/nginx-1.0.15.tar.gz
# 解壓壓縮包
tar -zxf nginx-1.0.15.tar.gz
# 進入解壓後的目錄
cd nginx-1.0.15
# 配置 nginx
./configure --prefix=/home/nginx
# 編譯安裝
make && make install
# 運行 nginx
sudo /home/nginx/sbin/nginx
此時訪問服務器地址應該可以看到 nginx 的歡迎頁面了。
獲得新版本二進制
# 下載 nginx-1.16.0
wget http://nginx.org/download/nginx-1.16.0.tar.gz
# 解壓壓縮包
tar -zxf nginx-1.16.0
# 進入解壓後的目錄
cd nginx-1.16.0/
# 配置 nginx
./configure --prefix=/home/nginx
# 只編譯不需要安裝
make
在編譯後的 objs 目錄中,可以看到二進制文件 nginx。
熱部署
經過以上步驟,我們實現了一個正在運行的舊版本 nginx 和編譯完成的新版本 nginx 二進制執行文件。
熱部署的流程是:
- 備份舊的 nginx 可執行文件
- 新的 nginx 可執行文件直接替換舊的(此時舊的 nginx 進程還在運行)
- 向 nginx master 進程發送熱部署信號,新的 nginx 進程啟動,舊的 worker 不再就收請求。
- 關閉舊的 worker 進程,完成熱部署。
# 備份
cp /home/nginx/sbin/nginx /home/nginx/sbin/nginx.old
# 替換
cp -f objs/nginx /home/nginx/sbin/nginx
# 查看 master pid
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process
# 發送熱部署信號,這裡 master pid 替換為自己查詢到的
kill -USR2 23712
# 查看當前 nginx 進程情況,27522 就是新的 master 進程
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process
root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process
# 關閉舊的 worker
kill -WINCH 23712
# 再次查看進程,可以發現舊的worker進程關閉了
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process
保留舊的 master 進程是為了在新的版本存在問題時,可以快速回退到原版本。如果發現問題要緊急回滾呢?
cp -f nginx.old nginx
# 拉起舊版本的worker進程(-HUP 相當於 -s reload)
kill -HUP old_master_pid
# 讓新版本的 worker 不再接受請求
kill -USR2 new_master_pid
# 關閉新版本的 woker 進程
kill -WINCH new_master_pid
如果確認無誤要退出老版本的 nginx,可以執行命令
kill -QUIT old_master_pid
快,關注米兜Java,一起漲姿勢~
熱點推薦
深入淺出Nginx,如何做到高併發下的高效處理?如何做到熱部署?
01前言
Nginx("engine x")是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。由於它的內存佔用少,啟動極快,高併發能力強,在互聯網項目中廣泛應用。
上圖簡單展示了Nginx的部署,Nginx類似網關。
02正向代理與反向代理
正向代理與反向代理有什麼區別暱?我們就不廢話先,直接上圖
這兩圖這麼一整,估計也很難理解清楚那個是正向代理,那個是反向代理。那我現在詳細解釋一下吧。
正向代理形如1圖,我們在aws上申請首次註冊送12月的服務器,然後它就是我們的VPN了,然後我們通過它就可以訪問YouTube了。不知道大夥能不能明白,正向代理是我們客戶端發起的,客戶端做出調整。
反向代理形如2圖,服務器A,服務器B,服務C部署在內網,我們通過Nginx暴露一個外網地址,小夥伴們就可以訪問我們了。
這麼講不知道能不能解釋清楚,大夥可以繼續看一下下面這個比喻:
正向代理:客戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東。
03Master-Worker模式
啟動Nginx後,其實就是在80端口啟動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。
1--進程數,建議設置和CPU個數一樣或2倍
2--日誌級別,默認error級別
3--Nginx 啟動後的pid 存放位置
4--配置每個進程的連接數,總的連接數= worker_processes * worker_connections根據物理內存大小來配置,默認1024
Master進程的作用是?
讀取並驗證配置文件nginx.conf;管理worker進程;
Worker進程的作用是?
每一個Worker進程都維護一個線程(避免線程切換),處理連接和請求;注意Worker進程的個數由配置文件決定,一般和CPU個數相關(有利於進程切換),配置幾個就有幾個Worker進程。
由nginx進程圖可以看到,我這邊配了兩個worker_processes,所以有兩個worker進程。
04如何做到高併發下的高效處理?
上文已經提及Nginx的worker進程個數與CPU綁定、worker進程內部包含一個線程高效迴環處理請求,這的確有助於效率,但這是不夠的。
作為專業的程序員,我們可以開一下腦洞:BIO/NIO/AIO、異步/同步、阻塞/非阻塞...
要同時處理那麼多的請求,要知道,有的請求需要發生IO,可能需要很長時間,如果等著它,就會拖慢worker的處理速度。
Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它可以監控多個事件是否準備完畢,如果OK,那麼放入epoll隊列中,這個過程是異步的。worker只需要從epoll隊列循環處理即可。
05如何做到熱部署?
所謂熱部署,就是配置文件nginx.conf修改後,不需要stop Nginx,不需要中斷請求,就能讓配置文件生效!(nginx -s reload 重新加載|nginx -t檢查配置|nginx -s stop 停止nginx)
通過上文我們已經知道worker進程負責處理具體的請求,那麼如果想達到熱部署的效果,可以想象:
方案一:
修改配置文件nginx.conf後,主進程master負責推送給woker進程更新配置信息,woker進程收到信息後,更新進程內部的線程信息。(有點valatile的味道)
方案二:
修改配置文件nginx.conf後,重新生成新的worker進程,當然會以新的配置進行處理請求,而且新的請求必須都交給新的worker進程,至於老的worker進程,等把那些以前的請求處理完畢後,kill掉即可。
Nginx採用的就是方案二來達到熱部署的!
模擬一個例子:
首先在本地模擬一個線上需要升級 Nginx 的環境,假設舊版本為 nginx-1.0.15,需要升級到 nginx-1.16.0。
開始之前,先牢記一下以下幾個命令:
- -HUP 平滑啟動(相當於reload)
- -USR2 平滑升級可執行程序,主要用在版本升級
- -WINCH 從容關閉工作進程
- -USR1 重新打開日誌文件,主要用在日誌切割(相當於reopen)
配置舊版本
# 下載 nginx-1.0.15
wget http://nginx.org/download/nginx-1.0.15.tar.gz
# 解壓壓縮包
tar -zxf nginx-1.0.15.tar.gz
# 進入解壓後的目錄
cd nginx-1.0.15
# 配置 nginx
./configure --prefix=/home/nginx
# 編譯安裝
make && make install
# 運行 nginx
sudo /home/nginx/sbin/nginx
此時訪問服務器地址應該可以看到 nginx 的歡迎頁面了。
獲得新版本二進制
# 下載 nginx-1.16.0
wget http://nginx.org/download/nginx-1.16.0.tar.gz
# 解壓壓縮包
tar -zxf nginx-1.16.0
# 進入解壓後的目錄
cd nginx-1.16.0/
# 配置 nginx
./configure --prefix=/home/nginx
# 只編譯不需要安裝
make
在編譯後的 objs 目錄中,可以看到二進制文件 nginx。
熱部署
經過以上步驟,我們實現了一個正在運行的舊版本 nginx 和編譯完成的新版本 nginx 二進制執行文件。
熱部署的流程是:
- 備份舊的 nginx 可執行文件
- 新的 nginx 可執行文件直接替換舊的(此時舊的 nginx 進程還在運行)
- 向 nginx master 進程發送熱部署信號,新的 nginx 進程啟動,舊的 worker 不再就收請求。
- 關閉舊的 worker 進程,完成熱部署。
# 備份
cp /home/nginx/sbin/nginx /home/nginx/sbin/nginx.old
# 替換
cp -f objs/nginx /home/nginx/sbin/nginx
# 查看 master pid
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process
# 發送熱部署信號,這裡 master pid 替換為自己查詢到的
kill -USR2 23712
# 查看當前 nginx 進程情況,27522 就是新的 master 進程
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process
root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process
# 關閉舊的 worker
kill -WINCH 23712
# 再次查看進程,可以發現舊的worker進程關閉了
ps -ef | grep nginx
root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx
nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process
保留舊的 master 進程是為了在新的版本存在問題時,可以快速回退到原版本。如果發現問題要緊急回滾呢?
cp -f nginx.old nginx
# 拉起舊版本的worker進程(-HUP 相當於 -s reload)
kill -HUP old_master_pid
# 讓新版本的 worker 不再接受請求
kill -USR2 new_master_pid
# 關閉新版本的 woker 進程
kill -WINCH new_master_pid
如果確認無誤要退出老版本的 nginx,可以執行命令
kill -QUIT old_master_pid
請留下你指尖的溫度
讓太陽擁抱你
記得這是一個有溫度的頭條號
米兜Java
print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"