nginx簡單配置上手
阿新 • • 發佈:2018-12-01
nginx是一個開源且高效能、可靠的HTTP中介軟體和代理伺服器
學習環境
作業系統
CENTOS>=7.0,位數 X64 CENTOS 7.2
環境確認
關閉 iptables
iptables命令是Linux上常用的防火牆軟體
功能 | 命令 |
---|---|
停止防火牆 | systemctl stop firewalld.service |
永久關閉防火牆 | systemctl disable firewalld.service |
確認停用 selinux
- 安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux,它是一個 Linux 核心模組,也是 Linux 的一個安全子系統。
- SELinux 主要作用就是最大限度地減小系統中服務程序可訪問的資源(最小許可權原則)。 | 功能 | 命令 | | :------- | :---------------------------------------------------------- | | 檢查狀態 | getenforce | | 檢查狀態 | /usr/sbin/sestatus -v | | 臨時關閉 | setenforce 0 | | 永久關閉 | /etc/selinux/config SELINUX=enforcing改為SELINUX=disabled |
安裝依賴模組
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
nginx的優勢
- IO多路複用 多個描述符的IO操作都能在一個執行緒裡併發交替順序完成,複用執行緒
- select 線性遍歷檔案描述符列表 1. 效率低下 2.最多隻能有1024
- epoll 每當fd就緒,採用系統回撥函式將fd放入 1.效率高 2.沒有1024限制
- CPU親和 一種把CPU核心和Nginx工作程序繫結方式,把每個worker程序固定在一個CPU上執行,減少切換CPU和提交快取命中率,獲得更好的效能。
- sendfile 零拷貝傳輸模式 ![usercore]
nginx安裝
版本分類
- Mainline version 開發版
- Stable version 穩定版
- Legacy versions 歷史版本
下載地址
CentOS下YUM安裝
/etc/yum.repos.d/nginx.repo
// 新建檔案需要配置的內容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
// 一下是執行命令
yum install nginx -y
nginx -v
nginx -V
// baseurl: centos 作業系統, 7 操走胸痛版本
目錄
安裝目錄
檢視配置檔案和目錄
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的日誌目錄 |
編譯引數
安裝目錄和路徑
--prefix=/etc/nginx // 按照目錄
--sbin-path=/usr/sbin/nginx // 可執行檔案目錄
--modules-path=/usr/lib64/nginx/modules // 模組的存放路徑
--conf-path=/etc/nginx/nginx.conf // 配置檔案存放路徑
--error-log-path=/var/log/nginx/error.log // 錯誤日誌路徑
--http-log-path=/var/log/nginx/access.log // 訪問日誌路徑
--pid-path=/var/run/nginx.pid // pid路徑
--lock-path=/var/run/nginx.lock // 鎖檔案路徑
執行對應模組時,nginx所保留的臨時性檔案
--http-client-body-temp-path=/var/cache/nginx/client_temp //
--http-proxy-temp-path=/var/cache/nginx/proxy_temp // 代理
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
設定nginx程序啟動的使用者和使用者組
--user=nginx
--group=nginx
設定額外的引數將被新增到CFLAGS變數
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong
設定附加的引數,連結系統庫
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
其它引數
--with-compat
--with-file-aio
--with-threads
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_mp4_module
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module
--with-http_ssl_module
--with-http_stub_status_module
--with-http_sub_module
--with-http_v2_module
--with-mail
--with-mail_ssl_module
--with-stream
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
配置檔案
- /etc/nginx/nginx.conf
- /etc/nginx/conf.d/*.conf /etc/nginx/conf.d/default.conf
全域性和服務配置
分類 | 配置項 | 作用 |
---|---|---|
全域性 | user | 設定nginx服務的系統使用使用者 |
全域性 | worker_processes | 工作程序數,一般和CPU數量相同 |
全域性 | error_log | nginx的錯誤日誌 |
全域性 | pid | nginx服務啟動時的pid |
全域性和服務配置
分類 | 配置項 | 作用 |
---|---|---|
events | worker_connections | 每個程序允許的最大連線數 10000 |
events | use | 指定使用哪種模型(select/poll/epoll),建議讓nginx自動選擇,linux核心2.6以上一般能使用epoll,提高效能。 |
/etc/nginx/nginx.conf
$http_x_forwarded_for 代理無伺服器,可能會有多個
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;//預設訪問日誌
sendfile on;//啟用sendfile
#tcp_nopush on;//懶傳送
keepalive_timeout 65;//超時時間是65秒
#gzip on;gzip壓縮
include /etc/nginx/conf.d/*.conf;//包含的子配置檔案
}
default.conf
server {
listen 80; //監聽的埠號
server_name localhost; //用域名方式訪問的地址
#charset koi8-r; //編碼
#access_log /var/log/nginx/host.access.log main; //訪問日誌檔案和名稱
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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# 代理PHP指令碼到80埠上的apache伺服器
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 不允許訪問.htaccess檔案
#location ~ /\.ht {
# deny all;
#}
}
啟動和重新載入
systemctl restart nginx.service
systemctl reload nginx.service
nginx -s reload
日誌型別
日誌型別
- access_.log 訪問日誌
- error.log 錯誤日誌
log_format
型別 | 用法 |
---|---|
語法 | log_format name [escape=default[json] string] |
預設 | log_format combined … |
Context | http |
案例
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format zfpx '$arg_name $http_referer sent_http_date"';
access_log /var/log/nginx/access.log main;
221.216.143.110 - - [09/Jun/2018:22:41:18 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" "-"
HTTP請求變數
名稱 | 含義 | 例子 |
---|---|---|
arg_PARAMETER | 請求引數 | $arg_name |
http_HEADER | 請求頭 | $http_referer |
sent_http_HEADER | 響應頭 | sent_http_cookie |
內建變數
ngx_http_log_module log_format
名稱 | 含義 |
---|---|
$remote_addr | 客戶端地址 |
$remote_user | 客戶端使用者名稱稱 |
$time_local | 訪問時間和時區 |
$request | 請求的URI和HTTP協議 |
$http_host | 請求地址,即瀏覽器中你輸入的地址(IP或域名) |
$status | HTTP請求狀態 |
$body_bytes_sent | 傳送給客戶端檔案內容大小 |
nginx實戰
靜態資源Web服務
- 靜態資源:一般客戶端傳送請求到web伺服器,web伺服器從記憶體在取到相應的檔案,返回給客戶端,客戶端解析並渲染顯示出來。
- 動態資源:一般客戶端請求的動態資源,先將請求交於web容器,web容器連線資料庫,資料庫處理資料之後,將內容交給web伺服器,web伺服器返回給客戶端解析渲染處理。
型別 | 種類 |
---|---|
瀏覽器渲染 | HTML、CSS、JS |
圖片 | JPEG、GIF、PNG |
視訊 | FLV、MPEG |
下載檔案 | Word、Excel |
CDN
- CDN的全稱是Content Delivery Network,即內容分發網路。
- CDN系統能夠實時地根據網路流量和各節點的連線、負載狀況以及到使用者的距離和響應時間等綜合資訊將使用者的請求重新導向離使用者最近的服務節點上。其目的是使使用者可就近取得所需內容,解決 Internet網路擁擠的狀況,提高使用者訪問網站的響應速度。
配置語法
sendfile
不經過使用者核心傳送檔案
型別 | 種類 |
---|---|
語法 | sendfile on / off |
預設 | sendfile off; |
上下文 | http,server,location,if in location |
tcp_nopush
在sendfile開啟的情況 下,提高網路包的傳輸效率
型別 | 種類 |
---|---|
語法 | tcp_nopush on / off |
預設 | tcp_nopush off; |
上下文 | http,server,location |
tcp_nodelay
在keepalive連線下,提高網路包的傳輸實時性
型別 | 種類 |
---|---|
語法 | tcp_nodelay on / off |
預設 | tcp_nodelay on; |
上下文 | http,server,location |
gzip
壓縮檔案可以節約頻寬和提高網路傳輸效率
型別 | 種類 |
---|---|
語法 | gzip on / off |
預設 | gzip off; |
上下文 | http,server,location |
gzip_comp_level
壓縮比率越高,檔案被壓縮的體積越小
型別 | 種類 |
---|---|
語法 | gzip_comp_level level |
預設 | gzip_comp_level 1; |
上下文 | http,server,location |
gzip_http_version
壓縮HTTP版本
型別 | 種類 |
---|---|
語法 | gzip_http_version 1.0/1.1 |
預設 | gzip_http_version 1.1; |
上下文 | http,server,location |
http_gzip-static_module
先找磁碟上找同名的.gz
這個檔案是否存在,節約CPU的壓縮時間和效能損耗
型別 | 種類 |
---|---|
語法 | gzip_static on/off |
預設 | gzip_static off; |
上下文 | http,server,location |
location ~ .*\.(jpg|png|gif)$ {
gzip off;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types image/jpeg image/png image/gif;
root /data/images;
}
location ~ .*\.(html|js|css)$ {
gzip on;
gzip_min_length 1k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/css application/javascript;
root /data/html;
}
location ~ ^/download {
gzip_static on;
tcp_nopush on;
root /data/download;
}
瀏覽器快取
校驗本地快取是否過期
型別 | 種類 |
---|---|
檢驗是否過期 | Expires、Cache-Control(max-age) |
Etag | Etag |
Last-Modified | Last-Modified |
expires
新增Cache-Control、Expires頭
型別 | 種類 |
---|---|
語法 | expires time |
預設 | expires off; |
上下文 | http,server,location |
location ~ .*\.(jpg|png|gif)$ {
expires 24h;
}
跨域
型別 | 種類 |
---|---|
語法 | add_header name value |
預設 | add_header --; |
上下文 | http,server,location |
location ~ .*\.json$ {
add_header Access-Control-Allow-Origin http://localhost:3000;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /data/json;
}
let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://47.104.184.134/users.json', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
}
xhr.send();
防盜鏈
- 防止網站資源被盜用
- 保證資訊保安
- 防止流量過量
- 區別哪些請求是非正常的使用者請求
- 使用http_refer防盜鏈
型別 | 種類 | 不規則來源 | ||
---|---|---|---|---|
語法 | valid_referers none | block | server_names | string… |
預設 | - | |||
上下文 | server,location |
location ~ .*\.(jpg|png|gif)$ {
expires 1h;
gzip off;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types image/jpeg image/png image/gif;
+ valid_referers none blocked 47.104.184.134;
+ if ($invalid_referer) {
+ return 403;
+ }
root /data/images;
}
代理服務
配置
型別 | 種類 |
---|---|
語法 | proxy_pass URL |
預設 | - |
上下文 | server,location |
反向代理
反向代理的物件的服務端
resolver 8.8.8.8;
location ~ ^/api {
proxy_pass http://127.0.0.1:3000;
}
正向代理
正向代理的物件是客戶端
location / {
proxy_pass http://$http_host$request_uri;
}
// $request_uri 請求的url
// $http_host 請求的域名
負載均衡
- 使用叢集是網站解決高併發、海量資料問題的常用手段。
- 當一臺伺服器的處理能力、儲存空間不足時,不要企圖去換更強大的伺服器,對大型網站而言,不管多麼強大的伺服器,都滿足不了網站持續增長的業務需求。
- 這種情況下,更恰當的做法是增加一臺伺服器分擔原有伺服器的訪問及儲存壓力。通過負載均衡排程伺服器,將來自瀏覽器的訪問請求分發到應用伺服器叢集中的任何一臺伺服器上,如果有更多的使用者,就在叢集中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為整個網站的瓶頸。
upstream
型別 | 種類 |
---|---|
語法 | upstream name {} |
預設 | - |
上下文 | http |
// 配置伺服器叢集
// 要放在server外邊
upstream serverGroup {
ip_hash;
server localhost:3000;
server localhost:4000;
server localhost:5000;
}
// serverGroup 叢集的名字
// 配置代理,讓serverGroup處理服務
server {
location / {
proxy_pass http://serverGroup;
}
後端伺服器除錯狀態
狀態 | 描述 |
---|---|
down | 不參與負載均衡 |
backup | 備份的伺服器 |
max_fails | 允許請求失敗的次數 |
fail_timeout | 經過max_fails失敗後,服務暫停的時間 |
max_conns | 限制最大的接收的連線數 |
upstream zfpx {
server localhost:3000 down;
server localhost:4000 backup;
server localhost:5000 max_fails=1 fail_timeout=10s;
}
分配方式
型別 | 種類 |
---|---|
輪詢(預設) | 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。 |
weight(加權輪詢) | 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。 |
ip_hash | 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。 |
url_hash(第三方) | 按訪問的URL地址來分配 請求,每個URL都定向到同一個後端 伺服器上(快取) |
fair(第三方) | 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。 |
least_conn | 最小連線數,哪個連線少就分給誰 |
自定義hash | hash自定義key |
快取
nginx代理快取
http{
proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
}
- proxy_cache_path 快取檔案路徑
- levels 設定快取檔案目錄層次;levels=1:2 表示兩級目錄
- keys_zone 設定快取名字和共享記憶體大小
- inactive 在指定時間內沒人訪問則被刪除
- max_size 最大快取空間,如果快取空間滿,預設覆蓋掉快取時間最長的資源。
location /tmp-test/ {
proxy_cache tmp-test;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}
- proxy_cache tmp-test 使用名為tmp-test的對應快取配置
- proxy_cache_valid 200 206 304 301 302 10d; 對httpcode為200…的快取10天
- proxy_cache_key $uri 定義快取唯一key,通過唯一key來進行hash存取
- proxy_set_header 自定義http header頭,用於傳送給後端真實伺服器。
- proxy_pass 指代理後轉發的路徑,注意是否需要最後的/