nginx搭建及加強
系統使用的是centos7
Nginx安裝及配置
Nginx (engine x) 是一個高性能的HTTP和反向代理web伺服器,同時也提供了IMAP/POP3/SMTP服務
安裝
我是用的環境是centos 7,系統預設的yum源沒有nginx,找到一個使用nginx官方源位址
首先建立nginx的yum倉庫,執行下面的指令
sudo rpm -ivh
http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm可以看到已經添加上了nginx的源,下面就是下載下傳安裝了
下載下傳安裝指令也很簡單
sudo yum install -y nginx
安裝成功^_^
檢視官方安裝文檔(
https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)上的源不一樣,不過都是一樣的建立本地yum倉庫
啟動nginx服務
service nginx start
預設是80端口,但測試通路發現并不能進入歡迎頁面,查了一下,centos預設是關閉80端口的,我們設定一下防火牆
開啟80端口
sudo firewall-cmd --zone=public --permanent --add-service=http
開啟443端口
sudo firewall-cmd --zone=public --permanent --add-service=https
必須要重新加載一下防火牆配置才行哦,下面我們再來通路一下
完美。
配置
預設的網站目錄為: /usr/share/nginx/html
全局的配置檔案為:/etc/nginx/nginx.conf
預設的配置檔案為: /etc/nginx/conf.d/default.conf
日志檔案目錄為:/var/log/nginx/
我們檢視具體的配置檔案内容,發現其實nginx.conf是主要的配置檔案,新增的都在/etc/nginx/conf.d/,nginx.conf将整個目錄的配置檔案都include了
配置結構
Nginx配置檔案常見結構的從外到内依次是「http」「server」「location」等等,預設的繼承關系是從外到内,也就是說内層塊會自動擷取外層塊的值作為預設值。
Http
http {
#檔案擴充名與檔案類型映射表
include /etc/nginx/mime.types;
#預設檔案類型
default_type application/octet-stream;
#日志格式
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指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出檔案,對于普通應用,必須設為on。如果用來進行下載下傳等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網絡IO處理速度,降低系統uptime。
sendfile on;
#此選項允許或禁止使用socket的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
#tcp_nopush on;
#長連接配接逾時時間,機關是秒
keepalive_timeout 65;
#開啟gzip壓縮輸出
#gzip on;
#導入其他配置
include /etc/nginx/conf.d/*.conf;
}
整個配置檔案結構其實大概是這樣的
#全局的配置
…………
server{
#虛拟主機的配置
…………
location {
#每個請求的處理,如請求轉發、靜态檔案映射、負載均衡等
…………
}
}
下面再具體了解一下每一層的配置
Server
接收請求的伺服器需要将不同的請求按規則轉發到不同的後端伺服器上,在 nginx 中我們可以通過建構虛拟主機(server)的概念來将這些不同的服務配置隔離。不同的url會對應不同的server配置,而轉發到相應的後端伺服器上做處理。
server {
listen 80; #服務監聽端口
server_name localhost; #服務的域名或IP
root html; #指定服務的頁面根目錄
index index.html index.htm; #指定通路的預設首頁位址
通常我們可以配置多個server,像這樣
listen 80;
server_name host1;
root html;
index index.html index.htm;
listen 80;
server_name host2;
root /data/www/html;
index index.html index.htm;
我們可以将不同的服務在/etc/nginx/conf.d/目錄下建立相應的conf以區分,友善管理,而nginx.conf會将這個目錄下的conf全部引入的。
Location
每個 url 請求都會對應的一個服務,nginx 進行處理轉發或者是本地的一個檔案路徑,或者是其他伺服器的一個服務路徑。而這個路徑的比對是通過 location 來進行的。我們可以将 server 當做對應一個域名進行的配置,而 location 是在一個域名下對更精細的路徑進行配置。
location [比對規則] {
#具體處理配置,如轉發、反向代理、負載均衡等
}
location 比對規則:
~ 波浪線表示執行一個正則比對,區分大小寫
~* 表示執行一個正則比對,不區分大小寫
^~ ^~表示普通字元比對,如果該選項比對,隻比對該選項,不比對别的選項,一般用來比對目錄
= 進行普通字元精确比對
比對例子:
location = / {
# 隻比對"/".
[ configuration A ]
location / {
# 比對任何請求,因為所有請求都是以"/"開始
# 但是更長字元比對或者正規表達式比對會優先比對
[ configuration B ]
location ^~ /images/ {
# 比對任何以 /images/ 開始的請求,并停止比對 其它location
[ configuration C ]
location ~* .(gif|jpg|jpeg)$ {
# 比對以 gif, jpg, or jpeg結尾的請求.
# 但是所有 /images/ 目錄的請求将由 [Configuration C]處理.
[ configuration D ]
請求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D
功能配置
主要的功能配置都是在location裡面的,下面我們來學習不同功能的配置方法
靜态檔案映射
通路檔案的配置主要有 root 和 alias
alias後跟的指定目錄是準确的,并且末尾必須加 /。
location /c/ {
alias /a/;
}
如果通路站點
http://location/c通路的就是/a/目錄下的站點資訊。
root後跟的指定目錄是上級目錄,并且該上級目錄下要含有和location後指定名稱的同名目錄才行。
root /a/;
}
這時通路站點
通路的就是/a/c目錄下的站點資訊。
配置起來很簡單比如我要将所有的請求到轉移到真正提供服務的一台機器的 8001 端口,隻要這樣:
location / { proxy_pass 172.16.1.1:8001; }
這樣通路host時,就都被轉發到 172.16.1.1的8001端口去了。
負載均衡
負載均衡伺服器清單配置在http下面
upstream myserver {
ip_hash;
server 172.16.1.1:8001;
server 172.16.1.2:8002;
server 172.16.1.3;
server 172.16.1.4;
location / {
proxy_pass http://myserver;
我們在 upstream 中指定了一組機器,并将這個組命名為 myserver,這樣在 proxypass 中隻要将請求轉移到 myserver 這個 upstream 中我們就實作了在四台機器的反向代理加負載均衡。
負載均衡的模式
輪詢:預設模式,每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
weight:指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的情況。
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
ip_hash:每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
fair:按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。
upstream backend {
server server1;
server server2;
fair;
url_hash:按通路url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,後端伺服器為緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
負載均衡裝置的IP及裝置狀态
每個裝置的狀态設定為: 1.down表示單前的server暫時不參與負載 2.weight為weight越大,負載的權重就越大。 3.max_fails:允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream子產品定義的錯誤 4.fail_timeout:max_fails次失敗後,暫停的時間。 5.backup: 其它所有的非back
up機器down或者忙的時候,請求backup機器。是以這台機器壓力會最輕。
upstream bakend{#定義負載均衡裝置的Ip及裝置狀态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
加強
隐藏伺服器版本号
預設我們通路不存在的頁面時,報錯頁面上會有nginx的版本資訊,這會向黑客提供資訊,以友善查找目前版本的漏洞,加以利用
修改ngixn.conf,http層裡面添加server_tokens off;
我們通路不存在的頁面試一下
這樣沒有版本資訊了
禁止目錄浏覽
預設是不允許列出整個目錄的,如果不是做下載下傳伺服器的,就不要打開這個,避免敏感資訊暴露給黑客并下載下傳
如果開啟了就會是下面這樣的效果
配置關閉即可
autoindex off
限制通路敏感資源
有些資源我們可能不想對外開放,比如一些版本控制的備份檔案,如.git/.svn等,這些暴露了可能會将整個項目的結構或是源代碼都洩露了,
location /my/ { deny all; }
上面我設定了my這個目錄下的所有資源都拒絕,效果如下
是以要識别好公開的資源,限制敏感資源的通路
限制HTTP請求方法
關閉沒必要的請求方法,一般都是get|post了
下面配置在server裡面,預期之外的會傳回500狀态
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 500; }
這個要放到最前面
限制IP/域名通路
ngx_http_access_module 子產品使有可能對特定IP用戶端進行控制. 規則檢查按照第一次比對的順序
location ~ .*my.html$ {
root /usr/share/nginx/html;
deny 192.168.0.105; #禁止ip
allow 192.168.189.134; #允許ip
deny all; #拒絕其他所有
}
限制通路的ip,即限制了服務的客戶,防止不允許的人通路,減少風險
控制逾時時間
可以緩解dos攻擊,避免黑客僞造使用者通路服務,造成伺服器壓力過大,帶寬占滿,備份nginx.conf配置檔案。
編輯配置檔案,具體設定如下:
client_body_timeout 10; #設定用戶端請求主體讀取逾時時間 client_header_timeout 10; #設定用戶端請求頭讀取逾時時間 keepalive_timeout 5 5; #第一個參數指定用戶端連接配接保持活動的逾時時間,第二個參數是可選的,它指定了消息頭保持活動的有效時間 send_timeout10; #指定響應用戶端的逾時時間
驗證一下設定
錯誤頁面重定向
避免錯誤頁面提供敏感資訊,一般我們會定制一些通用的錯誤頁面傳回給用戶端
我們在http段配置
error_page 500 502 503 504 /50x.html;
類似上面這種配置,将狀态碼500、502、503、504全部重定向到50x.html
nginx降級
如果發生入侵,擷取了目前運作nginx的使用者,則擁有該使用者的全新了,我們應當使用最下權限運作ngixn,絕對禁止root使用者運作!!!
備份nginx.conf配置檔案。
編輯配置檔案,添加如下一行内容:
user nobody;
儲存,然後後重新開機nginx服務。
說明:nobody在linux中是一個不能登陸的帳号,一些服務程序如apache,aquid等都采用一些特殊的帳号來運作,比如nobody,news,games等等,這是就可以防止程式本身有安全問題的時候,不會被黑客獲得root權限
原文位址
https://my.oschina.net/u/4479011/blog/3211896