Nginx學習(在 Docker 中使用 Nginx)

1. 安裝Nginx

使用 docker pull nginx 下載最新的 Nginx Docker 鏡像。
下載完畢后,使用 docker run -d -p 80:80 --name nginx nginx,即可啟動 Nginx 容器同诫。其中咙俩,-p 80:80 表示將容器的 80 端口映射到 主機的 80 端口向胡;--name nginx 表示將容器命名為“nginx”矾湃。

這時候,訪問主機 ip堕澄,可以看到 Nginx 的歡迎頁邀跃,說明已經(jīng)運行成功。

nginx

2. Nginx 配置

Nginx 的默認配置文件是 /etc/nginx/nginx.conf蛙紫。
使用 docker exec -it nginx /bin/sh 命令拍屑,進入 nginx 容器的命令行,然后進入 /etc/nginx 目錄坑傅,查看 nginx.conf 文件僵驰。

以下是該文件內(nèi)容及注釋:

# 設(shè)置運行 nginx 的用戶為 nginx 用戶
user  nginx;

# 根據(jù)系統(tǒng)資源情況自動設(shè)置 worker 進程數(shù)量
worker_processes  auto;

# 指定錯誤日志的位置和日志級別為 notice
error_log  /var/log/nginx/error.log notice;

# 指定 nginx 的主進程 ID 存儲位置
pid        /var/run/nginx.pid;

# events 塊定義了事件模型和連接數(shù)配置
events {
    # 每個 worker 進程的最大連接數(shù)
    worker_connections  1024;
}

# http 塊是 nginx 配置的主要部分,包含了 http 相關(guān)的配置
http {
    # 引入 mime.types 文件唁毒,該文件定義了 MIME 類型映射
    include       /etc/nginx/mime.types;

    # 設(shè)置默認 MIME 類型為 application/octet-stream
    default_type  application/octet-stream;

    # 設(shè)置日志格式 main蒜茴,記錄客戶端訪問日志
    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 功能,提高文件傳輸性能
    sendfile        on;

    # 如果客戶端連接非辰鳎快速粉私,則可能啟用 tcp_nopush,否則請注釋掉此行
    # tcp_nopush     on;

    # 客戶端與服務(wù)器之間的連接保持時間近零,超過這個時間將會自動關(guān)閉連接
    keepalive_timeout  65;

    # 如果需要開啟 gzip 壓縮功能诺核,可以去掉此行的注釋
    #gzip  on;

    # 引入 /etc/nginx/conf.d/ 目錄下的所有 .conf 配置文件
    include /etc/nginx/conf.d/*.conf;
}

根據(jù)上述配置,可以在 /etc/nginx/conf.d 文件夾下久信,找到所有的 nginx 配置文件窖杀。默認情況下,該文件夾中只有一個 default.conf 文件裙士,查看之:

# cat default.conf
# 定義一個HTTP服務(wù)器塊入客,監(jiān)聽80端口,并且同時監(jiān)聽IPv4和IPv6地址的80端口
server {
    listen       80;
    listen  [::]:80;
    # 服務(wù)器名為localhost潮售,即請求的域名為localhost時痊项,會使用該server塊的配置
    server_name  localhost;

    # 注釋掉以下access_log配置,表示不記錄訪問日志
    #access_log  /var/log/nginx/host.access.log  main;

    # 配置根目錄和默認的索引文件
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 注釋掉以下error_page配置酥诽,表示不自定義錯誤頁
    #error_page  404              /404.html;

    # 配置5xx錯誤碼的錯誤頁
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 注釋掉以下配置鞍泉,表示不使用代理將PHP腳本傳遞給Apache服務(wù)器
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # 配置FastCGI服務(wù)器,將PHP腳本傳遞給監(jiān)聽在127.0.0.1:9000的FastCGI服務(wù)器
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # 注釋掉以下配置肮帐,表示禁止訪問.htaccess文件
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

可以看到咖驮,這里配置了 http 的監(jiān)聽端口边器,和一些跳轉(zhuǎn)規(guī)則。

2.1 http 塊配置

Nginx 的配置分為多個塊托修,其中 http 塊是其中的主要部分忘巧,包含了 http 的相關(guān)配置。

http 塊主要可以設(shè)置以下參數(shù):

  • include:可以引入其他配置文件睦刃。例如砚嘴,include /etc/nginx/mime.types; 表示引入了 /etc/nginx/mime.types 文件,其中包含了支持的文件類型涩拙。
  • default_type: 指定默認的Content-Type际长,當請求的資源沒有明確指定Content-Type時,將使用該默認類型兴泥。
  • log_format: 定義日志格式工育,可以自定義日志輸出的格式,可以使用預定義的變量來包含特定信息搓彻,例如$remote_addr表示客戶端IP地址如绸,$request表示請求內(nèi)容,等等旭贬。
  • access_log: 配置訪問日志的路徑和格式怔接。可以指定日志輸出到文件骑篙,也可以將日志重定向到標準輸出流蜕提。
  • error_log: 配置錯誤日志的路徑和日志級別“卸耍可以指定日志輸出到文件谎势,也可以將日志重定向到標準錯誤流。
  • sendfile: 是否開啟sendfile指令杨名。當該指令開啟時脏榆,nginx會嘗試使用sendfile系統(tǒng)調(diào)用來直接傳輸文件,提高文件傳輸效率台谍。
  • tcp_nopush: 開啟后须喂,允許發(fā)送TCP_NODELAY選項來減少網(wǎng)絡(luò)傳輸延遲。
  • keepalive_timeout: 配置HTTP keep-alive連接的超時時間趁蕊。如果一個客戶端在這個時間內(nèi)沒有發(fā)送新的請求坞生,連接將被關(guān)閉。
  • gzip: 配置gzip壓縮掷伙。開啟后是己,nginx會對響應的內(nèi)容進行g(shù)zip壓縮,減少傳輸數(shù)據(jù)量任柜,提高性能卒废。
  • server: 用于配置一個虛擬主機(Server Block)沛厨,包含了服務(wù)器的監(jiān)聽端口、域名摔认、請求處理等配置逆皮。一個http塊可以包含多個server塊,用于配置多個虛擬主機参袱。
  • location: 用于配置請求處理的規(guī)則电谣。location塊可以根據(jù)URL路徑或正則表達式來匹配請求,并指定相應的處理邏輯抹蚀,例如反向代理辰企、重定向、文件處理等况鸣。
  • upstream: 配置代理服務(wù)器的集群。upstream指令用于定義一組后端服務(wù)器竹观,并可以指定負載均衡算法來分配請求镐捧。

2.2 http - server 塊配置

在 Nginx 的 http 配置中,可以包含多個 server 配置臭增。如下:

http {
    # server塊1
    server {
        # 該server塊的配置
    }
    # server塊2
    server {
        # 該server塊的配置
    }
}

其中懂酱,server 塊的主要參數(shù)包含:

  • listen: 配置服務(wù)器監(jiān)聽的端口號和IP地址√芘祝可以通過listen指令指定多個端口號和IP地址列牺,比如listen 80;表示監(jiān)聽80端口,默認監(jiān)聽所有可用IP地址拗窃。
  • server_name: 配置服務(wù)器的域名或IP地址瞎领。可以配置多個域名随夸,用空格隔開九默。當請求的Host頭部與server_name中的某個域名匹配時,該server塊將會處理該請求宾毒。
  • add_header: 用于設(shè)置響應頭信息驼修。
  • location: 用于配置請求處理的規(guī)則。location塊可以根據(jù)URL路徑或正則表達式來匹配請求诈铛,并指定相應的處理邏輯乙各,例如反向代理、重定向幢竹、文件處理等耳峦。
  • access_log和error_log: 配置訪問日志和錯誤日志的路徑和格式。
  • try_files: 配置文件搜索順序妨退。當請求的文件不存在時妇萄,可以通過try_files指令指定多個備用文件蜕企,服務(wù)器會按照指定的順序查找并返回第一個存在的文件。
  • gzip: 配置gzip壓縮冠句。開啟后轻掩,nginx會對響應的內(nèi)容進行g(shù)zip壓縮,減少傳輸數(shù)據(jù)量懦底,提高性能唇牧。

例如,上述提到過的 default.conf 文件聚唐,主要內(nèi)容如下:

# 定義一個HTTP服務(wù)器塊丐重,監(jiān)聽80端口,并且同時監(jiān)聽IPv4和IPv6地址的80端口
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    # 注釋掉以下access_log配置杆查,表示不記錄訪問日志
    #access_log  /var/log/nginx/host.access.log  main;

    # 配置根目錄和默認的索引文件
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 注釋掉以下error_page配置扮惦,表示不自定義錯誤頁
    #error_page  404              /404.html;

    # 配置5xx錯誤碼的錯誤頁
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

該配置定義了一個名為 localhost 的 server,監(jiān)聽本機 80 端口亲桦。

2.3 http - server - location 配置

location 配置是Nginx中用來匹配請求URI(Uniform Resource Identifier)并指定如何處理請求的指令崖蜜。在Nginx配置文件中,location 塊用于根據(jù)不同的 URI 路徑來定義不同的行為客峭,如代理請求豫领、重定向、設(shè)置緩存等舔琅。

配置類型

location 塊有不同的匹配類型:

  • 普通匹配:使用前綴匹配或完全匹配來匹配請求URI等恐。
    例如 location /example:匹配以/example開頭的URI路徑。
  • =:精準匹配备蚓。
    例如 location = /path/to/resource课蔬,只有當請求的URI完全等于 /path/to/resource 時,該 location 塊才會生效星著。
  • ~:正則表達式匹配购笆。
    例如 location ~ ^/images/.*\.jpg$:匹配以 /images/ 開頭且以 .jpg 結(jié)尾的URI路徑。
  • ~*:不區(qū)分大小寫的正則表達式匹配虚循。
    例如 location ~* \.jpg$:會匹配以 .jpg 結(jié)尾的URI同欠,不區(qū)分大小寫。
  • ^~:優(yōu)先匹配横缔。
    例如 location ^~ /static/:匹配以 /static/ 開頭的URI路徑,該匹配的優(yōu)先級高于其他匹配茎刚。

配置塊參數(shù)

location 配置塊中可以配置一些參數(shù)襟锐,常見的如下:

  • root:指定location塊的根目錄,用于確定請求資源的實際文件路徑蚊荣。例如:root /usr/share/nginx/html;
  • alias:類似于root媳叨,但是可以將URI路徑替換為指定的路徑糊秆,不包括location路徑平痰。例如:alias /path/to/files;
  • try_files:定義嘗試查找文件的順序觉增,用于處理靜態(tài)文件請求逾礁。例如:try_files $uri $uri/ /index.html;
  • proxy_pass:將請求代理到指定的后端服務(wù)。例如:proxy_pass http://backend_server;
  • rewrite:重寫URI砾嫉,可用于重定向或修改請求URI墙杯。例如:rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
  • auth_basic:啟用基本的HTTP身份驗證观腊。例如:auth_basic "Restricted Area";
  • if:條件判斷鲸阔,根據(jù)條件執(zhí)行不同的指令。注意if指令有一些限制和陷阱,建議謹慎使用。
  • limit_rate:限制請求速率倘核,用于限制客戶端訪問速度。例如:limit_rate 100k;
  • expires:設(shè)置緩存過期時間轻庆,用于控制靜態(tài)資源的緩存時間。例如:expires 1d;
  • add_header:添加自定義HTTP響應頭作岖。例如:add_header X-MyHeader "My Custom Header";
  • proxy_set_header:設(shè)置代理請求頭。例如:proxy_set_header X-Real-IP $remote_addr;
  • proxy_redirect:修改代理請求的重定向頭沉删。例如:proxy_redirect off;
  • proxy_pass_header:設(shè)置代理響應的頭信息采幌。例如:proxy_pass_header Server;

下面是一個簡單的Nginx配置示例:

# 定義一個HTTP服務(wù)器塊,監(jiān)聽80端口,并且設(shè)置主機名為example.com
server {
    listen 80;              # 監(jiān)聽80端口
    server_name example.com; # 設(shè)置主機名為example.com

    # 處理請求根路徑的配置
    location / {
        root /usr/share/nginx/html; # 設(shè)置根目錄為/usr/share/nginx/html
        index index.html;           # 設(shè)置默認的索引文件為index.html
    }

    # 處理以/images/開頭的請求路徑
    location /images/ {
        alias /var/www/images/;     # 將URI路徑替換為/var/www/images/
    }

    # 處理以/api/開頭且以.json結(jié)尾的請求路徑
    location ~ ^/api/.*\.json$ {
        proxy_pass http://backend_server; # 將請求代理到后端服務(wù)器backend_server
    }
}

2.4 http - server - upstream 配置

upstream 塊用于定義一組后端服務(wù)器犀农,用于負載均衡或代理請求惰赋。
例如:

upstream my_backend {
    server backend_server1:8000;   # 定義第一個后端服務(wù)器,格式為 server [IP或域名]:端口
    server backend_server2:8000;   # 定義第二個后端服務(wù)器,可以配置多個服務(wù)器
    server unix:/tmp/backend.sock; # 也可以使用Unix Socket代替IP和端口
    weight=1;                      # 設(shè)置服務(wù)器的權(quán)重赁濒,默認為1轨奄,負載均衡時會根據(jù)權(quán)重分配請求
    max_fails=3;                   # 設(shè)置請求失敗次數(shù)的閾值,默認為1拒炎,超過閾值后服務(wù)器被認為不可用
    fail_timeout=10s;              # 設(shè)置服務(wù)器的失敗超時時間挪拟,默認為10秒
    backup;                        # 設(shè)置服務(wù)器為備份服務(wù)器,在其他服務(wù)器不可用時使用
    down;                          # 設(shè)置服務(wù)器為暫時不可用狀態(tài)击你,不會分配請求給該服務(wù)器
}

在 upstream 塊中玉组,可以配置多個后端服務(wù)器,Nginx 會根據(jù)負載均衡算法將請求分發(fā)給這些后端服務(wù)器丁侄。
需要注意的是惯雳,如果是在 Docker 中運行的 Nginx,則這里的 server 字段可以配置為 容器名稱:端口號绒障,如 ixiaoniu:8080吨凑。

在定義了 upstream 塊后,便可以在 location 塊中通過 proxy_pass 指令將請求代理到定義的 upstream 塊中的后端服務(wù)器:

    location / {
        proxy_pass http://my_backend; # 將請求代理到名為 my_backend 的 upstream 塊中定義的后端服務(wù)器
    }

3. 一些常用命令

  • docker exec -it nginx bash:進入在 Docker 中運行的 Nginx 容器命令行户辱。
  • nginx -v:顯示 Nginx 版本鸵钝。
  • nginx -t:測試 Nginx 配置文件是否有錯誤。
  • nginx -s reload:重新加載配置庐镐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩商,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子必逆,更是在濱河造成了極大的恐慌怠堪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件名眉,死亡現(xiàn)場離奇詭異粟矿,居然都是意外死亡,警方通過查閱死者的電腦和手機损拢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門陌粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人福压,你說我怎么就攤上這事掏秩。” “怎么了荆姆?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵蒙幻,是天一觀的道長。 經(jīng)常有香客問我胆筒,道長邮破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮决乎,結(jié)果婚禮上队询,老公的妹妹穿的比我還像新娘。我一直安慰自己构诚,他們只是感情好蚌斩,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著范嘱,像睡著了一般送膳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丑蛤,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天叠聋,我揣著相機與錄音,去河邊找鬼受裹。 笑死碌补,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棉饶。 我是一名探鬼主播厦章,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼照藻!你這毒婦竟也來了袜啃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤幸缕,失蹤者是張志新(化名)和其女友劉穎群发,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體发乔,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡熟妓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栏尚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片起愈。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抵栈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坤次,我是刑警寧澤古劲,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站缰猴,受9級特大地震影響产艾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一闷堡、第九天 我趴在偏房一處隱蔽的房頂上張望隘膘。 院中可真熱鬧,春花似錦杠览、人聲如沸弯菊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽管钳。三九已至,卻和暖如春软舌,著一層夾襖步出監(jiān)牢的瞬間才漆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工佛点, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醇滥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓超营,卻偏偏與公主長得像鸳玩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糟描,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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