nginx
做為現在最流行的代理伺服器,在佔用記憶體小,效能高效,反向代理,負載均衡等方面有很大的優勢,經常被使用部署來訪問前端靜態資源以及介面層做轉發,那麼我們該怎麼開始上手nginx呢?按照下面說明一步步配置你的nginx
。
-
下載nginx
-
環境
CENTOS>=7.0,位數 X64 CENTOS 7.2
-
關閉 iptables
iptables命令是Linux上常用的防火牆軟體
功能 命令 停止防火牆 systemctl stop firewalld.service 永久關閉防火牆 systemctl disable firewalld.service -
安裝依賴
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim 複製程式碼
-
開始安裝nginx
新建一個檔案
vi /etc/yum.repos.d/nginx.repo 複製程式碼
內容輸入如下:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 複製程式碼
其中 centos/7 根據自己執行環境配置 系統名/版本號
下載nginx
yum install nginx -y nginx -v nginx -V 複製程式碼
參考資料: nginx安裝前所需配置
nginx常用操作
-
檢視配置檔案和目錄
rpm -ql nginx 複製程式碼
相關檔案說明:
型別 路徑 用途 配置檔案 /etc/logrotate.d/nginx 用於logrotate服務的日誌切割 配置檔案 /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf 主配置檔案 配置檔案 /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params cgi配置,fastcgi配置 配置檔案 /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf 編碼轉換對映轉化檔案 配置檔案 /etc/nginx/mime.types 設定http協議的Content-Type與副檔名對應關係 配置檔案 /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug 用於配置系統守護程式管理器管理方式 配置檔案 /etc/nginx/modules /usr/lib64/nginx/modules nginx模組目錄 命令 /usr/share/doc/nginx-1.14.0 /usr/share/doc/nginx-1.14.0/COPYRIGHT nginx的手冊和幫助檔案 目錄 /var/cache/nginx nginx的快取目錄 目錄 /var/log/nginx nginx的日誌目錄 -
啟動和重新載入以及關閉
systemctl restart nginx.service systemctl reload nginx.service systemctl stop nginx.service nginx -s reload 複製程式碼
如果在啟動的時候可能會遇到下列問題:
- 埠被佔用;
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind 複製程式碼
可以先檢視程式,再殺死對應程式
netstat -ntpl kill 程式號 複製程式碼
-
配置nginx
/etc/nginx/nginx.conf
檢視日誌命令 tailf -f log目錄
複製程式碼
user nginx; 設定nginx服務的系統使用使用者
worker_processes 1; 工作程式數,一般和CPU數量相同
error_log /var/log/nginx/error.log warn; nginx的錯誤日誌
pid /var/run/nginx.pid; nginx服務啟動時的pid
events {
worker_connections 1024;每個程式允許的最大連線數 10000
}
http {
include /etc/nginx/mime.types;//檔案字尾和型別型別的對應關係
default_type application/octet-stream;//預設content-type
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;//預設訪問日誌 日誌格式與log_format main 對應
sendfile on;//啟用sendfile
#tcp_nopush on;//懶傳送 客戶端請求資料不會每次都時時相應 讓資料塞滿一次性傳送給客戶端(多用於下載、斷點 續傳)
#tcp_nodelay on; // 預設開啟 與nopush互斥 提高實時請求響應效率
keepalive_timeout 65;//超時時間是65秒
#gzip on;gzip壓縮
include /etc/nginx/conf.d/*.conf;//包含的子配置檔案
}
複製程式碼
日誌型別說明
型別 | 描述 |
---|---|
access_log | 訪問日誌 |
error.log | 錯誤日誌 |
log_format | 日誌格式 |
本身內建的一些變數
- http請求相關變數
名稱 | 含義 | 例子 |
---|---|---|
arg_PARAMETER | 請求引數 | $arg_name |
http_HEADER | 請求頭 | $http_referer |
sent_http_HEADER | 響應頭 | sent_http_cookie |
- 內建變數
名稱 | 含義 |
---|---|
$remote_addr | 客戶端地址 |
$remote_user | 客戶端使用者名稱稱 |
$time_local | 訪問時間和時區 |
$request | 請求的URI和HTTP協議 |
$http_host | 請求地址,即瀏覽器中你輸入的地址(IP或域名) |
$status | HTTP請求狀態 |
$body_bytes_sent | 傳送給客戶端檔案內容大小 |
預設配置 /etc/default.conf
server {
listen 80;
# 用域名方式訪問的地址
server_name localhost;
#charset koi8-r; //編碼
#access_log /var/log/nginx/host.access.log main; //訪問日誌檔案和名稱
# 代理
location / {
proxy_pass http://localhost:3000
}
# 轉發請求靜態資源(js、css)規則
location ~ .*\.(html|js|css)$ {
# CORS
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,DELETE;
add_header Access-Control-Allow-Headers Content-Type;
# 預設帶上客戶端cookie
add_header Access-Control-Allow-Credentials true;
# 快取1h
expires 1h;
# 開啟gzip
gzip on;
# gzip壓縮HTTP版本號 一般是1.1
gzip_http_version 1.1;
# gzip壓縮等級 越大壓縮率越高 1-9
gzip_comp_level 2;
# 預設不指定不會快取css資源 需要指定text/css型別
gzip_types application/javascript text/css;
# 資源目錄
root /data/html;
}
# 設定圖片請求規則
location ~ .*\.(gif|png|jpg|webp)$ {
expires 1h;
gzip on;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types image/jpeg image/png image/gif image/webp;
## 防盜鏈
valid_referers none blocked xx.xxx.xxx.xx;
if ($invalid_referer) {
return 403;
}
# 資源目錄
root /data/html;
}
location ~ ^/download {
# 預設先查詢當前目錄下的字尾為.gz檔案 有直接返回給客戶端 不需要再壓縮
# linux下執行gzip 檔名會生成壓縮gz檔案
# url最直接訪問該檔案路徑就會自動啟動下載該資源
gzip_static on;
tcp_nopush on;
root /data/download;
}
location / {
root /usr/share/nginx/html; //靜態檔案根目錄
index index.html index.htm; //首頁的索引檔案
}
#error_page 404 /404.html; //指定錯誤頁面
# redirect server error pages to the static page /50x.html
# 把後臺錯誤重定向到靜態的50x.html頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 把PHP指令碼9000埠上監聽的FastCGI服務
#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檔案 只允許指定的ip訪問
location ~ /\.ht {
allow 127.0.0.1
deny all;
}
}
複製程式碼
實現負載均衡
為了解決高併發、海量資料等問題
複製程式碼
分配選項:
型別 | 描述 |
---|---|
輪詢(預設) | 每個請求按照時間順序逐一分配不同的後端伺服器; |
ip_hash | 每個請求按訪問ip的hash結果分配,這樣每個訪客固定放一個後端伺服器,可以解決session的問題; |
weight(加權輪詢) | 指定輪詢策略,weight和訪問比率成正比,用於後端伺服器效能不均的情況; |
least_conn | 最小連線數,哪個連線少就分給誰。 |
叢集|後端伺服器除錯狀態:
狀態 | 描述 |
---|---|
down | 不參與負載均衡 |
backup | 備份的伺服器 |
max_fails | 允許請求失敗的次數 |
fail_timeout | 經過max_fails失敗後,服務暫停的時間 |
max_conts | 限制最大的接收的連線數 |
具體案例如下:
```shell
upstream test1 {
ip_hsah;
server http://localhost:3000 weight=2;
server http://localhost:4000 weight=1;
server http://localhost:5000 down;
}
server {
# 訪問負載均衡構造的叢集
location / {
# 和upstrem的name對應
proxy_pass http://test1;
}
}
server {
listen 80;
server_name www.test1.com;
location / {
proxy_pass http://localhost:3000;
}
}
server {
listen 80;
server_name www.test2.com;
location / {
proxy_pass http://localhost:4000;
}
}
server {
listen 80;
server_name www.test3.com;
location / {
proxy_pass http://localhost:5000;
}
}
```
訪問www.test.com通過代理到訪問www.test1.com,而訪問test1的請求被負載均衡按照策略訪問test1或者test2
複製程式碼
代理
- 反向代理
對客戶端只有一個暴露的地址,內部對客戶端是一個黑盒。
location ~ ^/api {
proxy_pass http://127.0.0.1:3000;
}
複製程式碼
- 正向代理
管理客戶端的發出請求,並代理客戶端去請求實際訪問地址。
location / {
proxy_pass http://$http_host$request_uri;
}
複製程式碼
參考資料: