關於 nginx 前端知道這些就夠了

6666發表於2019-01-19

我備案了個域名,買了一個阿里雲伺服器,想要搭建幾個自己的網站,難免要接觸 nginx

那麼我用 nginx 來幹嘛呢:

  1. 靜態資源反向代理
  2. 將域名泛解析到伺服器之後,通過 nginx 來給不同的二級域名分配伺服器上的程式。

1、安裝 nginx

1.1、centos7

yum install -y nginx

1.2、windows

到官網下載,安裝包,解壓即可使用:官網

1.3、centos7 中 nginx 常用命令

# 開機啟動
systemctl enable nginx.service

# 啟動
systemctl start nginx.service

# 使用某個配置檔案啟動(要先關閉 ngxin,不然會報錯的)
nginx -c /etc/nginx/nginx.conf

# 關閉(如果這樣關閉不了的話,就把 nginx 程式給殺掉)
nginx -s stop

# 檢視 nginx 的程式 id
ps -ef | grep nginx

# 殺死程式(比如殺死程式1234)
kill -9 1234

nginx 的預設配置檔案是:/etc/nginx/nginx.conf

這個配置檔案會自動讀取:/etc/nginx/conf.d/ 資料夾下的所有 .conf 檔案。

假如你寫了個網站,需要用到 nginx ,那麼你就把配置檔案丟到 /etc/nginx/conf.d/ 資料夾下,然後重啟 nginx 就行了:

nginx -s stop
nginx -c /etc/nginx/nginx.conf

2、nginx 配置(反向代理設定 & 二級域名)

2.1 配置檔案

假設我們有兩個網站:
www.example.com
blog.example.com

它們分別有兩個 ngxin 配置檔案放在:
/home/www.example.com/www.example.com.nginx.conf
/home/blog.example.com/blog.example.com.nginx.conf

伺服器對外開放 80 埠,兩個網站對應的程式埠分別為:

www.example.com 程式 8000
www.example.com 靜態資源 8080

blog.example.com 程式 8001
blog.example.com 靜態資源 8081

那麼他們的配置內容分別為:

# /home/www.example.com/www.example.com.nginx.conf
server {
    # 伺服器對外只監聽 80 埠
    listen 80;
    # 當 80 埠監聽到了來自 www.example.com 的請求
    server_name www.example.com;
    # 那麼把這個請求轉到 http://localhost:8080
    location / {
        proxy_pass http://localhost:8080;
    }
}
server {
    # 監聽到 8080 埠有人發起請求(其實就是上面轉過來的↑,使用者不能直接訪問 8080 埠的)
    listen 8080;
    # 只允許本機訪問
    server_name localhost;
    # 程式根目錄
    root /home/www.example.com;
    # 預設的網頁檔案
    index index.html index.htm;
    # 匹配所有 uri (如果 url 為:http://www.example.com/hehe,那麼 uri 為:/hehe)
    location / {
        # 我們的程式實際上是在 8000 埠上
        proxy_pass http://localhost:8000$request_uri;

        # 下面這一大堆,欲知詳情自己查
        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;
    }
    # 匹配首頁
    location = / {
        proxy_pass http://localhost:8000;
    }
    # 匹配 /**.** 結尾的 uri,並且不是 /**.html、/**.htm
    location ~* ^.+/[^/]+(?=.)([^/](?!(html|htm)))+$ {
      # 匹配到的都定位到靜態資源目錄裡
      root /home/www.example.com/static;
      etag         on;
      expires      max;
    }
}
# /home/blog.example.com/blog.example.com.nginx.conf
server {
    # 伺服器對外只監聽 80 埠
    listen 80;
    # 當 80 埠監聽到了來自 blog.example.com 的請求
    server_name blog.example.com;
    # 那麼把這個請求轉到 http://localhost:8081
    location / {
        proxy_pass http://localhost:8081;
    }
}
server {
    # 監聽到 8081 埠有人發起請求(其實就是上面轉過來的↑,使用者不能直接訪問 8081 埠的)
    listen 8081;
    # 只允許本機訪問
    server_name localhost;
    # 程式根目錄
    root /home/blog.example.com;
    # 預設的網頁檔案
    index index.html index.htm;
    # 匹配所有 uri (如果 url 為:http://blog.example.com/hehe,那麼 uri 為:/hehe)
    location / {
        # 我們的程式實際上是在 8001 埠上
        proxy_pass http://localhost:8001$request_uri;

        # 下面這一大堆,欲知詳情自己查
        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;
    }
    # 匹配首頁
    location = / {
        proxy_pass http://localhost:8001;
    }
    # 匹配 /**.** 結尾的 uri,並且不是 /**.html、/**.htm
    location ~* ^.+/[^/]+(?=.)([^/](?!(html|htm)))+$ {
      # 匹配到的都定位到靜態資源目錄裡
      root /home/blog.example.com/static;
      etag         on;
      expires      max;
    }
}

注意看兩個配置的區別。

2.2 建立軟連結

假如我們每個網站程式放在一個資料夾裡,該程式的 nginx 配置檔案也應該放在這個資料夾裡才方便管理。但前面提到,我們需要把配置檔案丟到 /etc/nginx/conf.d/ 資料夾下,怎樣才能使這個配置檔案既在程式資料夾下,又在 /etc/nginx/conf.d/資料夾下呢?

假如我們在程式資料夾下有一個 ngxin 配置檔案:/home/www.example.com/www.example.com.nginx.conf

我們需要給這個檔案建立一個軟連結到 /etc/nginx/conf.d/ 下:

ln -s /home/example/example.nginx.conf /etc/nginx/conf.d/www.example.com.nginx.conf

這樣操作之後,當我們改程式資料夾下的配置檔案,/etc/nginx/conf.d/ 下與之對應的配置檔案也會被修改,修改後重啟 nginx 就能夠使新的 ngxin 配置生效了。

相關文章