nginx反向代理 + go web服務(wù)器實(shí)踐

首先下載nginx

下載頁面

作者用的是windows谨读,所以我這里就下window的1.13.12版本局装。
下載完成后解壓到C盤:


nginx

打開我們的命令行窗口,定位到我們的nginx目錄劳殖,
start nginx

start nginx

我們可以打開瀏覽器訪問以下http://localhost

nginx 安裝成功

如果你能看到上圖铐尚,就說明安裝成功了。

且放一邊哆姻。宣增。。

下載Go
同樣的矛缨,還是選擇window版本爹脾,下載完成后,一路next箕昭,就默認(rèn)裝到C盤灵妨。

下載Goland
激活碼搜一下http://idea.youbbs.org

New Project命名為GoTest
依次新建 src目錄,新建http1目錄落竹,并新建一個(gè)http1.go

GoTest項(xiàng)目結(jié)構(gòu)

http1.go:

package main

import (
    "fmt"
    "net/http"
    "strings"
    "log"
)

func printRequest(r *http.Request) {
    fmt.Println("r.Form=", r.Form)         //這些信息是輸出到服務(wù)器端的打印信息 , Get參數(shù)
    fmt.Println("r.PostForm=", r.PostForm) //Post參數(shù)
    fmt.Println("path=", r.URL.Path)
    fmt.Println("scheme=", r.URL.Scheme)
    fmt.Println("method=", r.Method) //獲取請(qǐng)求的方法

    fmt.Println("Http Get參數(shù)列表 begin:")
    for k, v := range r.Form {
        fmt.Println("Http Get["+k+"]=", strings.Join(v, " ; "))
    }
    fmt.Println("Http Get參數(shù)列表 end:")

    fmt.Println("Http Post參數(shù)列表 begin:")
    for k, v := range r.PostForm {
        fmt.Println("Http Post["+k+"]=", strings.Join(v, " ; "))
    }
    fmt.Println("Http Post參數(shù)列表 end:")

    arraA := r.Form["a"]
    fmt.Println("r.Form['a']=", arraA)
    if len(arraA) > 0 {
        fmt.Println("r.Form['a'][0]=", arraA[0])
    }
}

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm() //解析參數(shù)闷串,默認(rèn)是不會(huì)解析的
    fmt.Println("******************************************sayhelloName")
    printRequest(r)

    fmt.Fprintf(w, "<h1>Hello 世界!</h1>") //這個(gè)寫入到w的是輸出到客戶端的
}

func sayMore(w http.ResponseWriter, r *http.Request) {
    r.ParseForm() //解析參數(shù),默認(rèn)是不會(huì)解析的
    fmt.Println("******************************************sayMore")
    printRequest(r)

    fmt.Fprintf(w, "<h1>Hello More!</h1>") //這個(gè)寫入到w的是輸出到客戶端的
}

func sayMore1(w http.ResponseWriter, r *http.Request) {
    r.ParseForm() //解析參數(shù)筋量,默認(rèn)是不會(huì)解析的
    fmt.Println("******************************************sayMore1")
    printRequest(r)

    fmt.Fprintf(w, "<h1>Hello More1!</h1>") //這個(gè)寫入到w的是輸出到客戶端的
}

func main() {
    http.HandleFunc("/", sayhelloName)       //設(shè)置訪問的路徑
    http.HandleFunc("/more", sayMore)        //設(shè)置訪問的路徑
    http.HandleFunc("/more/", sayMore1)      //設(shè)置訪問的路徑
    err := http.ListenAndServe(":9090", nil) //設(shè)置監(jiān)聽的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

運(yùn)行http1.go

運(yùn)行http1.go

運(yùn)行之后,我們打開瀏覽器訪問http://localhost:9090

訪問結(jié)果

在goland中碉熄,我們也能看到打印的日志:


訪問日志

設(shè)置nginx反向代理
打開


nginx.conf

修改之后的文件
nginx.conf:

#運(yùn)行用戶
#user nobody;
#啟動(dòng)進(jìn)程,通常設(shè)置成和cpu的數(shù)量相等
worker_processes  1;

#全局錯(cuò)誤日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#工作模式及連接數(shù)上限
events {
    #epoll是多路復(fù)用IO(I/O Multiplexing)中的一種方式,
    #僅用于linux2.6以上內(nèi)核,可以大大提高nginx的性能
    #use   epoll; 

    #單個(gè)后臺(tái)worker process進(jìn)程的最大并發(fā)鏈接數(shù)    
    worker_connections  1024;

    # 并發(fā)總數(shù)是 worker_processes 和 worker_connections 的乘積
    # 即 max_clients = worker_processes * worker_connections
    # 在設(shè)置了反向代理的情況下桨武,max_clients = worker_processes * worker_connections / 4  為什么
    # 為什么上面反向代理要除以4,應(yīng)該說是一個(gè)經(jīng)驗(yàn)值
    # 根據(jù)以上條件锈津,正常情況下的Nginx Server可以應(yīng)付的最大連接數(shù)為:4 * 8000 = 32000
    # worker_connections 值的設(shè)置跟物理內(nèi)存大小有關(guān)
    # 因?yàn)椴l(fā)受IO約束呀酸,max_clients的值須小于系統(tǒng)可以打開的最大文件數(shù)
    # 而系統(tǒng)可以打開的最大文件數(shù)和內(nèi)存大小成正比,一般1GB內(nèi)存的機(jī)器上可以打開的文件數(shù)大約是10萬左右
    # 我們來看看360M內(nèi)存的VPS可以打開的文件句柄數(shù)是多少:
    # $ cat /proc/sys/fs/file-max
    # 輸出 34336
    # 32000 < 34336琼梆,即并發(fā)連接總數(shù)小于系統(tǒng)可以打開的文件句柄總數(shù)性誉,這樣就在操作系統(tǒng)可以承受的范圍之內(nèi)
    # 所以窿吩,worker_connections 的值需根據(jù) worker_processes 進(jìn)程數(shù)目和系統(tǒng)可以打開的最大文件總數(shù)進(jìn)行適當(dāng)?shù)剡M(jìn)行設(shè)置
    # 使得并發(fā)總數(shù)小于操作系統(tǒng)可以打開的最大文件數(shù)目
    # 其實(shí)質(zhì)也就是根據(jù)主機(jī)的物理CPU和內(nèi)存進(jìn)行配置
    # 當(dāng)然,理論上的并發(fā)總數(shù)可能會(huì)和實(shí)際有所偏差错览,因?yàn)橹鳈C(jī)還有其他的工作進(jìn)程需要消耗系統(tǒng)資源纫雁。
    # ulimit -SHn 65535
}


http {
    #設(shè)定mime類型,類型由mime.type文件定義
    include    mime.types;
    default_type  application/octet-stream;
    #設(shè)定日志格式
    #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 指令指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,
    #對(duì)于普通應(yīng)用倾哺,必須設(shè)為 on,
    #如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用轧邪,可設(shè)置為 off,
    #以平衡磁盤與網(wǎng)絡(luò)I/O處理速度羞海,降低系統(tǒng)的uptime.
    sendfile     on;
    #tcp_nopush     on;

    #連接超時(shí)時(shí)間
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #tcp_nodelay     on;

    #開啟gzip壓縮
    #gzip  on;
    #gzip_disable "MSIE [1-6].";

    #設(shè)定請(qǐng)求緩沖
    #client_header_buffer_size    128k;
    #large_client_header_buffers  4 128k;


    #設(shè)定虛擬主機(jī)配置
    server {
        #偵聽80端口
        listen    80;
        #定義使用 www.nginx.cn訪問
        server_name  www.nginx.cn;

        #定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
        root html;

        #設(shè)定本虛擬主機(jī)的訪問日志
        #access_log  logs/nginx.access.log  main;

        #默認(rèn)請(qǐng)求
        location / {
            #定義首頁索引文件的名稱
            index index.php index.html index.htm;   

        }

        # 定義錯(cuò)誤提示頁面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }

        #靜態(tài)文件忌愚,nginx自己處理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            
            #過期30天,靜態(tài)文件不怎么更新却邓,過期可以設(shè)大一點(diǎn)硕糊,
            #如果頻繁更新,則可以設(shè)置得小一點(diǎn)腊徙。
            expires 30d;
        }

        #PHP 腳本請(qǐng)求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        #禁止訪問 .htxxx 文件
        location ~ /.ht {
            deny all;
        }

    }
    
    ## 設(shè)置反向代理简十,指向go服務(wù)器 ##
    server {
        listen 8081;
        #server_name  www.xxx.cn;
     
        #access_log  logs/quancha.access.log  main;
        #error_log  logs/quancha.error.log;
        root   html;
        index  index.html index.htm index.php;
     
        ## send request back to apache ##
        location / {
            proxy_pass  http://localhost:9090;#go 服務(wù)器可以指定到其他的機(jī)器上,這里設(shè)定本機(jī)服務(wù)器
     
            #Proxy Settings
            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;
            #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            #proxy_max_temp_file_size 0;
            #proxy_connect_timeout      90;
            #proxy_send_timeout         90;
            #proxy_read_timeout         90;
            #proxy_buffer_size          4k;
            #proxy_buffers              4 32k;
            #proxy_busy_buffers_size    64k;
            #proxy_temp_file_write_size 64k;
       }
    }
    ## End 設(shè)置反向代理昧穿,指向go服務(wù)器 ##
}

打開我們的最早的命令行窗口,輸入nginx -s reload

重載nginx配置

訪問http://localhost:8081/

訪問結(jié)果

OK成功訪問到我們nginx配置的go服務(wù)器勺远。

我們還可以使用Post的方式帶上路徑或者參數(shù)訪問
比如:


postman 請(qǐng)求

打印日志:


goland 打印輸出

上面那個(gè)日志可以看出r.Form包含了r.PostForm參數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末时鸵,一起剝皮案震驚了整個(gè)濱河市胶逢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饰潜,老刑警劉巖初坠,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彭雾,居然都是意外死亡碟刺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門薯酝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半沽,“玉大人,你說我怎么就攤上這事吴菠≌咛睿” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵做葵,是天一觀的道長占哟。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么榨乎? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任怎燥,我火速辦了婚禮,結(jié)果婚禮上蜜暑,老公的妹妹穿的比我還像新娘铐姚。我一直安慰自己,他們只是感情好史煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布谦屑。 她就那樣靜靜地躺著,像睡著了一般篇梭。 火紅的嫁衣襯著肌膚如雪氢橙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天恬偷,我揣著相機(jī)與錄音悍手,去河邊找鬼。 笑死袍患,一個(gè)胖子當(dāng)著我的面吹牛坦康,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诡延,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼滞欠,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了肆良?” 一聲冷哼從身側(cè)響起筛璧,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惹恃,沒想到半個(gè)月后夭谤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巫糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年朗儒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参淹。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醉锄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浙值,到底是詐尸還是另有隱情恳不,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布亥鸠,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏负蚊。R本人自食惡果不足惜神妹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家妆。 院中可真熱鬧鸵荠,春花似錦、人聲如沸伤极。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哨坪。三九已至庸疾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間当编,已是汗流浹背届慈。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忿偷,地道東北人金顿。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像鲤桥,于是被迫代替她去往敵國和親揍拆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容