前言
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
原始碼安裝
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 進行設定. 例如下面要求
已知第三方模組
- nginx-http-concat 前端JS,CSS檔案合併資源
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 是一個優秀的代理伺服器, 還有很多未知的知識亟待去挖掘