【運維】nginx伺服器基本配置指南

wayneli發表於2019-01-19

前言

Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器

安裝

  • yum安裝
  • 原始碼安裝

yum安裝

以CentOS6.5 為例

設定yum源, vi etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/x86_64/
gpgcheck=0
enabled=1

設定代理 vi /etc/yum.conf (公網情況下可忽略)

proxy=代理IP

命令安裝

sudo yum install nginx

原始碼安裝

下載nginx原始碼

wget http://nginx.org/download/nginx-1.13.12.tar.gz

tar -xvzf nginx-1.13.12.tar.gz

cd nginx-1.13.12

./configure --prefix=/usr/local/nginx

make

sudo make install

模組擴充套件安裝

在安裝nginx的時候, 往往會有配置需求, 同時如果我們想要安裝一個第三方的模組, 則需要 –add-module 進行設定. 例如下面要求

已知第三方模組


git clone https://github.com/alibaba/nginx-http-concat.git

# nginx 編譯  
./configure --add-module=/path/to/nginx-http-concat

make 

sudo make install

原始碼重新編譯

有時候, 我們需要給現有的nginx加入一些擴充套件模組. 那麼就需要通過對應的版本的原始碼, 重新configure, 具體步驟如下:

# 老的nginx 執行 nginx -V
/usr/local/nginx/sbin/nginx -V

# nginx 同一版本下的原始碼 執行 configure, 附加新的模組
./configure --prefix=/usr/local/nginx --add-module=/path/to/nginx-http-concat

# 編譯
make

# 備份老的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

# 將objs目錄下產生新的 nginx 覆蓋老的nginx
cp objs/nginx /usr/local/nginx/sbin/nginx

# 如果出現檔案開啟錯誤,執行下面這句
mkdir -p /dev/shm/nginx_temp/client_body

# 測試
sudo /usr/local/nginx/sbin/nginx -t

# 平滑重啟nginx
sudo /usr/local/nginx/sbin/nginx -s reload

nginx配置

基本配置

user www www; # 使用者名稱 使用者組

http {
    # http服務設定
      
    # 引入多個mime型別
    include mime.types;
    
    # 啟用gzip壓縮
    gzip on;
    
    # 錯誤頁面重定向
    error_page  400 401 402 403 404 405 408 410 412 413 414 415 500 501 502 503 506 = /error.html;
    
    # 引入額外配置
    include vhosts/*.conf;
}

虛擬主機配置

使用者請求 host為 liylblog.com 主機時, 將訪問 root 目錄下的資源

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
}

路由匹配設定

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    
    # 最長優先匹配, 所以 / 為最後匹配規則
    location / {
        # 設定預設的index檔名稱
        index index.html index.html;
        try_files $uri $uri/;
    }
    
    # 以.php結尾或者 .php/xxx 結尾的路徑, ~ 表示大小寫敏感
    location ~ .php($|/) {
        # 規則
    }
    
    # 大小寫敏感, 以 /img/ 開頭的資源路徑將被匹配
    # /img/logo.png
    # /img/avatar.png
    location ^~ /img/ {
        # 規則
    }
    
    # 大小寫敏感, 匹配 /api 資源
    location ^~ = /api {
        f( !-e $request_filename )
        {
            rewrite ^/api /api/ last;
        }
    }
}

nginx 配置負載均衡


server {
    listen       80;
    server_name  liylblog.com;

    location / {
        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_pass http://proxy_stream;
    }
}

# 多臺機器代理, 背後可能是其它web伺服器
upstream proxy_stream {
    server 192.168.1.1 max_fails=3 fail_timeout=30s;
    server 192.168.1.2 max_fails=3 fail_timeout=30s;
}

反向代理

PHP-FPM代理

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    access_log /usr/local/nginx/logs/liylblog.access.log;
    error_log  /usr/local/nginx/logs/liylblog.error.log;

    location / {
        index  index.html index.htm index.php;
        if (!-e $request_filename) { ## if 後面必須有空格
            rewrite ^(.*)$ /index.php?s=$1 last;
            break;
        }
    }
    # 大小寫敏感, 匹配.php字尾結尾或者 .php/ 結尾的路徑
    location ~ .php($|/) {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        client_max_body_size 100M;
        fastcgi_connect_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
        include fastcgi_params;
     }

}

Node.js 代理

server {
    listen       80;
    server_name  liylblog.com;
    root         /home/www/liyblog/html;
    access_log /usr/local/nginx/logs/liylblog.access.log;
    error_log  /usr/local/nginx/logs/liylblog.error.log;

    location @proxy {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:7001;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_cache_key sfs$request_uri$scheme;
    }   

    location / { 
        autoindex on; 
        index  index.html index.htm;
        # 嘗試訪問地址 例如, 訪問 $root/foo, $root/foo/index.html, $root/foo/index.htm, $proxy/foo; 
        try_files $uri $uri/ @proxy;
    }   
}

小結

nginx 是一個優秀的代理伺服器, 還有很多未知的知識亟待去挖掘

相關文章