linux進階運維之nginx
Nginx -one:
基本了解
Nginx搭建
使用者認證
基于域名的虛拟主機
安全的ssl虛拟主機
基本了解
常見的web伺服器比較:
Unix和Linux平台:Apache Nginx tengine Tomcat Lighttpd
Windows:IIs(Internet information server)
Tengine 淘寶引擎 優化了Nginx
server:"tarena" 請求頭檔案中顯示的版本 改過的
不要暴露自己的伺服器軟體及版本容易被×××。
網頁類型:
php python: apache nginx tengine lighttpd
java : tomcat IBM WebSphere Jboss
Nginx搭建:
1、安裝:
yum -y install gcc pcre-devel openssl-devel
pcre-devel redhat中以-devel結束的包通常是代表依賴包 這個是支援相容Perl語言的正則
redhat中@anaconda/7.4通常是代表這個已經裝上了沒有這個的代表是在Yum中而沒有裝。
useradd -s /sbin/nologin nginx
tar -xf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure:
--prefix=/usr/local/nginx \ //指定安裝路徑
> --user=nginx \ //指定使用者
> --group=nginx \ //指定組
以普通使用者來啟動服務!更安全 被×××以後也隻會獲得普通使用者權限而且是/sbin/nologin 不能登陸的使用者。
> --with-http_ssl_module //開啟SSL加密功能
子產品話設計:盡可能多的人的需求
100個功能 互相獨立 可以選擇需求功能安裝 設計為100個子產品。
不知道子產品就可以安預設
/.configure時就相當于windows下裝軟體時選擇功能後下一步下一步。可以選路徑子產品 功能
第一次裝的時候可以直接confiure 它會告訴你有哪些依賴包你沒裝。gcc 沒有就裝gcc
什麼沒有裝什麼。
make && make install
make 把src的c語言的轉為二進制的格式 生成一個程式 但是在家目錄下
make install 把make生成的程式拷貝到可執行路徑下 等等操作。
nginx -V 能看到别人安裝軟體時是怎麼confgiure的了可以照着安裝。
nginx version: nginx/1.10.3
configure arguments: --prefix=/usr/local/nginx
--user=nginx --group=nginx --with-http_ssl_module
ln -s /usr/local/nginx/sbin/nginx /sbin/
做了個快捷方式到可執行程式路徑下,可以直接nginx後Tab了友善管理服務
ll /sbin/nginx 可以看到軟連結情況。
nginx 啟動服務
/usr/local/nginx/sbin/nginx -s reload //重新加載配置檔案
必須在服務開啟時才能用。不關服務時重讀配置檔案!!! 不會影響别人的服務通路。
setenforce 0
firewall-cmd --set-default-zone=trusted
curl http://127.0.0.1 通路測試
2、平滑更新:
cd nginx-1.12.2
./configure
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module
make 千萬不要make install 這樣就覆寫安裝了,不是平滑更新了。
conf html logs 都希望保留
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
sbin 把這個下面的程式更新。更新有風險最好備份一下老的程式nginxold 想用老的就用nginxold。
cp objs/nginx /usr/local/nginx/sbin/
objs裡放的是make出來的新的可執行綠色程式。
make upgrade 殺死老程式 重新啟動更新後的新程式。
make upgrade 失敗了就
netstat -natulp | egrep nginx 看程序号 7035
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7035/nginx
kill 7035 或者killall nginx 再啟動服務即可
nginx
nginx -V
nginx version: nginx/1.12.2
程式、程序、線程:
程式program (下載下傳到硬碟的) 很多是多程序的程式 可以同時通路多個頁面(并發高些,占記憶體高)
程序process(記憶體裡啟動的程式,程序之間是獨立的不會互相影響)
線程thread (程序下面再啟動的加線程 更省記憶體一些 程序挂了下面的8個線程全挂了 程序線程結合着用
pstree
├─polkitd───5*[{polkitd}] 這個程序中啟動了5個線程。
worker_processes 1; 輕按兩下時啟動1個程序。
使用者認證:
vim /usr/local/nginx/conf/nginx.conf (配置檔案架構)
<VirtualHost *:80>
ServerName www0.example.com
DocumentRoot /var/www/nsd01
</VirtualHost> nginx的虛拟主機和Apache的虛拟主機類似
全局配置
(程序所有者;啟動程序數量;日志檔案;pid檔案;單程序最大并發量;...)
http{ 配置容器
server{ 虛拟主機
listen 80;
server_name localhost;
root html; 釋出目錄(位置)
location / {
root html;
index index.html index.htm;
}
}
server{
listen 80;
server_name www.xyz.com;
root www;
}
}
server中添加:
auth_basic "Input Password:"; //認證提示符
auth_basic_user_file "/usr/local/nginx/pass"; //認證密碼檔案 怎麼敲都沒有!要在這個路徑下建一樣的檔案 寫上密碼和使用者名。
install httpd-tools
htpasswd -c /usr/local/nginx/pass tom 第一個使用者要-c
cat /usr/local/nginx/pass
tom:$apr1$0fBOo/ZS$lIw/0axG5oQ7kELEb5D1K1
htpasswd /usr/local/nginx/pass lisi 第二個使用者不要c
删除使用者就直接vim進去删除。
nginx -s reload
firefox http://192.168.4.5
基于域名的virtualhost
理論概述:
使用者沒用域名直接用IP的話出來的頁面為配置檔案中的第一個server的頁面
容器配置中 域名 IP 端口 總有一個不一樣,哪個不一樣就是基于哪個的虛拟主機。
ctrl + v 選了以後再x就可以批量去注釋了。
nginx 的配置檔案 /usr/local/nginx/conf/nginx.conf
nginx 的(root)預設網頁根目錄 /usr/local/nginx/html
改配置:
第一個sever
server_name www.a.com;
location:root html;
第二個sever
server_name www.b.com;
location:root www;
mkdir /usr/local/nginx/www
echo "www" > /usr/local/nginx/www/index.html
nginx -s reload
vim /etc/hosts
192.168.4.5 www.a.com www.b.com
firefox http://www.a.com
firefox http://www.b.com
安全的ssl虛拟主機
理論概述:
ssl 加密網站部署
http協定是明文協定
https協定是加密協定
對稱加密
加123 解123 同一把鑰匙
非對稱
加123 解dkfgjhdlk (随機) 無任何規律 不是同一把鑰匙。
md5: 網上的所有妙傳都是基于這個原理 壓根都沒傳 核對md5 一樣的就不用傳了。
鑒黃師 删除的是md5 相關的所有檔案 就把這個視訊都在網上删除了。
校驗檔案内容是否有變化 網站上東西時會提供md5碼 用于檢驗下載下傳檔案是否完整。
不安全 被破解了。 山東大學 王小東
碼是用内容來決定的 内容不變碼不變 隻于檔案内容有關。
非對稱加密:
浏覽器自動下載下傳了公鑰 浏覽器自動用公鑰加密了資料 網站自動用私鑰來解密
openssl req -new -x509 -key cert.key > cert.pem //生成證書
請求生成 一個新的證書 格式為509 鑰匙是剛剛生成的私鑰匙。
第一個必須兩個字母其他的随便。
實驗:
生成私鑰與證書
cd /usr/local/nginx/conf
openssl genrsa > cert.key
openssl req -new -x509 -key cert.key > cert.pem
改Nginx配置
vim /usr/local/nginx/conf/nginx.conf
server裡location外:
listen 443 ssl;
server_name www.c.com;
ssl_certificate cert.pem; #這裡是證書檔案
ssl_certificate_key cert.key; #這裡是私鑰檔案
nginx -s reload
vim /etc/hosts
192.168.4.5 www.c.com www.a.com www.b.com
firefox https://www.c.com
nginx-two:
LNMP平台搭建及位址重寫:
主流端企業網站平台之一:LNMP(LAMP)
lnmp:linux nginx (mariadb | mysql) (php | python | perl )新項目多數是這個
lamp:linux apache(mariadb | mysql) (php | python | perl )老項目用的這個能不動就不動
動态頁面:java php python perl ruby
靜态頁面:html
一、lnmp平台搭建:
安裝步驟:按照lnmp這幾個字母的順序進行安裝避免出錯。
1安裝源碼包的依賴包
yum -y install gcc openssl-devel pcre-devel(位址重寫要這個包) zlib-devel
2安裝完成nginx并啟服務
cd nginx-1.12.2/ 進入解壓後的位置
useradd -s /sbin/nolgin/ nginx 建立一個不能登入端使用者
./configure --help 子產品不記得了就help
./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx
--with-http_ssl_module --with-stream --with-http_stub_status_module
--without-http_autoindex_module --without-http_ssi_module
--with-http_ssl_module 加密子產品
--with-stream 代理子產品
--with-http_stub_status_module 檢視nginx狀态子產品
--without-http_autoindex_module 禁用檔案索引子產品
--without-http_ssi_module
以上是常用子產品可以根據需要自行選擇
make && make install
ln -s /usr/local/nginx/sbin/nginx /sbin/
nginx
ss -natulp |grep 80
3安裝mariadb(用戶端 啟動服務) mariadb-server(服務端 提供mysql命名) mariadb-devel(依賴包)
如果是mysql就安裝mysql
yum -y install mariadb mariadb-server mariadb-devel
安裝nosql資料庫
yum -y install memcached
4安裝php(解釋器) php-mysql(調用mariadb資料庫的子產品)
php-fpm php-pecl-memcache (調用memcache資料庫的子產品)
cd php_scripts/
yum -y install php php-mysql
yum -y install php-pecl-memcache
yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
5啟服務和關防火牆
服務:nginx mariadb php-fpm memcached
nginx
systemctl restart mariadb
systemctl enable mariadb
systemctl restart php-fpm
systemctl enable php-fpm
systemctl restart memcached.service
systemctl enable memcached
setenforce 0
firewall-cmd --set-default-zone=trusted
6修改配置檔案使能夠通路php動态網站(動靜分離)
vim /usr/local/nginx/conf/nginx.conf //nginx配置檔案
#location 位置nginx 讓使用者進入
#nginx 做判斷靜态或動态 靜态直接給 動态要交給php解釋器
#location比對使用者位址欄
#同個server下可以多個location
#比對及停止,類似if elif else的判斷
location / { #/的優先級最低什麼都找不着就比對根
root html;
index index.php index.html index.htm;
#設定預設首頁為index.php(隻寫域名或IP時)
}
location ~ \.php$ { #nginx支援正則 ~比對。類似awk的~号比對 (幫使用者找php)
root html;
fastcgi_pass 127.0.0.1:9000; //找到php交給9000端口解釋
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf; //fastcgi.conf 一堆環境變量
}
#改錯了可以cp nginx.conf.default nginx.conf 還原配置檔案
vim /etc/php-fpm.d/www.conf //php配置檔案 預設不用修改
[www]
listen = 127.0.0.1:9000 //PHP端口号
pm.max_children = 32 //php是多程序的;最大程序數量
pm.start_servers = 15 //最小程序數量
pm.min_spare_servers = 5 //最少需要幾個空閑着的程序
随時待命一旦小于5個就自動再開啟了
pm.max_spare_servers = 32 //最多允許幾個程序處于空閑狀态
7驗證結果:
cp mem.php /usr/local/nginx/html
curl 192.168.2.111/mem.php (結果為test)
幾種常見排錯:
三個常用日志:
/usr/local/nginx/logs/access.log Nginx的預設通路日志檔案
/usr/local/nginx/logs/error.log Nginx的預設錯誤日志檔案
/var/log/php-fpm/www-error.log PHP預設錯誤日志檔案
空白(頁面寫錯了 但是第一個日志沒有報錯 證明nginx沒有錯,
頁面給你了,但是頁面是空。直接看php-fpm服務的報錯!!
下載下傳 (沒做動态分離)
an Error (php沒啟動)
配置檔案改錯 最容易發現,因為服務都啟不來。
tailf /usr/local/nginx/logs/error.log 弄到空白處 再通路test.php 最後幾行一定時相關日志。
二、位址重寫:(需要依賴包pcre-devel)
文法格式:
rewrite 舊位址 新位址 [選項]
所有通路a.html的請求,重定向到b.html;
location下加:
rewrite /a.html /b.html; (位址欄沒變)
rewrite /a.html /b.html redirect; (跳轉位址欄)
所有通路192.168.4.5的80端口就把請求重定向至www.baidu.com;
server_name下加: (注意空格)
rewrite ^/(空格)http://www.baidu.com/; 在打開自己網站之前就跳轉
正則是比對包含就算 通路4.5不管是啥都跳到tmooc。
所有通路192.168.4.5/下面子頁面,重定向至www.baidu.com/下相同的頁面;
server_name下加: (注意空格)
rewrite ^/(.*)$(空格)http://www.baidu.com/$1; 第一個$可有可無
$1 與正則中的\1等效 就是把根目錄下的.* 粘貼到tmooc的/下。
實作firefox與curl通路相同頁面檔案,傳回不同的内容。
理論基礎:
不同浏覽器通路相同頁面,傳回的頁面的結果不同。 (手機浏覽器和電腦浏覽器頁面不同)
電腦:sina.com
手機:sina.com 結果不同 按鈕和功能不同。
首先伺服器要知道用戶端的浏覽器是什麼。
關于變量$http_user_agent :
Nginx的預設通路日志檔案為/usr/local/nginx/logs/access.log 這裡能知道用戶端的浏覽器
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#'$status $body_bytes_sent "$http_referer" '
#'"$http_user_agent" "$http_x_forwarded_for"';
這些變量都是nginx的内置變量。
"$http_user_agent"可識别用戶端的資訊。
192.168.4.254 - - [26/May/2018:16:36:46 +0800] "GET /xixi HTTP/1.1" 302 161 "-" "Mozilla/5.0
(X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
通常企業會設計兩套頁面 手機和PC
/usr/local/nginx/html/寬{a b c }html 預設是通路這個
如果你是uc 手機 。。。就跳轉
rewrite /(.*)
/usr/local/nginx/html/andriod/窄{a b c} html 做個跳轉
最終結果:
server裡,location外面加:
if ($http_user_agent ~* firefox) {rewrite ^(.*)$ /firefox/$1;}
#if ($http_user_agent ~* firefox)等價于grep firefox "$http_user_agent"
位址重寫格式【總結】:
rewrite a c last(不再讀其他rewrite) | break (不再讀其他語句,結束請求 )
比對到了才會a跳到c才會執行last 或者break 不然相當于沒寫
有點if的意思 if a 再跳c elif b 跳d。。。
rewrite b d redirect 臨時重定向
rewrite e f permament 永久重定向
redirect permament 給蜘蛛看的 蜘蛛 :百度 搜狗 360.。。等搜尋引擎。
賣鞋子的:
url: www.jd.com/a 臨時的就不動 如果是永久 就直接改資料庫為www.jd.com/c讓使用者直接通路c
逗蜘蛛完可能被直接除名影響生意。
nginx-three:
nginx排程
web高可用
tcp/udp服務代理
nginx調優
web高可用:
負載均衡上面挂了直接轉下面(類似備份功能) 帶健康檢查後面機子壞了轉到另外一台。
普通的情況下,nginx代理沒有壓力的因為它隻負責轉發 不負責頁面請求!
——————web1
a |
user————》proxy———— |
b |
——————-web2
nginx排程器算法:
輪詢算法:預設算法
ip_hash算法:相同用戶端通路相同伺服器。
nginx實作web反向代理: 定義叢集和調用叢集
部署實施後端Web伺服器
vim /usr/local/nginx/conf/nginx.conf
定義叢集: (後期調用)一個配置檔案可以寫n多個upsteam。web伺服器有多少加多少。
upstream webserver {
server 192.168.2.111:80 weight=1 max_fails=1 fail_timeout=20;
//設定權重 :性能好的多承擔。沒改過預設都是1 各承擔一次輪詢一次。
3的話就是接收3次請求再交給别人。
//max_fails=1 連一次不通覺得連不上了就認為這個web伺服器挂了。
//fail_timeout=30 挂了之後30秒之内不找你了。 每隔30秒就又去連一次,好了就繼續輪詢。
server 192.168.2.222:80;
server 192.168.2.101 down;
//人為判斷标記為關機要很久才能修好 先使它不參與叢集排程不去試它好沒有,節省資源。
}
location / {
proxy_pass http://webserver; //調用叢集,将請求轉給後端web伺服器
root html; #這個要改掉,不改的話自己就是web伺服器了不是代理伺服器,到自己根下去給客戶機找頁面了。
index index.html index.htm;
#rewrite /a.html /b.html redirect;
}
nginx -s reload
curl 192.168.4.5
web1
curl 192.168.4.5
web1
加上ip_hash算法:隻需要在叢集伺服器前加上ip_hash;
解決你輸了賬号密碼登上伺服器了,隻是輪詢算法的話,一重新整理就會到另外一台伺服器上去
另外伺服器沒有你的賬号密碼資訊的話就會讓你重新登陸!
upstream webserver {
#通過ip_hash設定排程規則為:相同用戶端通路相同伺服器
ip_hash;
server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
}
tips://最終的nginx反向代理web結果:ip哈希加輪詢都要有!
tcp/udp服務代理:
需要--with-stream
四層排程,所有服務的代理,都是走tcp/ip協定 隻是端口号不一樣。
代理不同的服務隻需要服務的端口号不一樣就可以了。
可以實作隻要能ping通的情況下家裡就能連公司的伺服器或資料庫或web,不用管ip位址。
代理就是能通路平時通路不了的網站啊 是以不管是什麼網段的能ping通代理伺服器的ip就可以了。
新技術出來找不到資料就找官網
——————tcp/udp服務(ssh)
a |
user————》proxy———— |
b |
——————tcp/udp服務(ssh)
使用nginx代理可以用192.168.4.100 ssh 192.168.2.222 就是可以連不同網段。
源碼安裝Nginx軟體--with-stream
啟用Nginx服務,修改/usr/local/nginx/conf/nginx.conf配置檔案
stream {
upstream backend {
server 192.168.2.100:22; //後端SSH伺服器的IP和端口
server 192.168.2.200:22;
}
server {
listen 12345; //Nginx監聽的端口
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
}
nginx -s reload
[root@client ~]# ssh 192.168.4.5 -p 12345 //多次通路檢視效果
nginx調優:
如果用戶端通路伺服器提示“Too many open files”如何解決
如何解決用戶端通路頭部資訊過長的問題
如何讓用戶端浏覽器緩存資料
如何自定義傳回給用戶端的404錯誤頁面
如何檢視伺服器狀态資訊
開啟gzip壓縮功能,提高資料傳輸效率
環境準備:
建構Nginx伺服器并啟動服務
解決用戶端通路伺服器提示“Too many open files”
儲備知識:cat /proc/cpuinfo | grep process
lscpu :雙核雙程序 假四核。 //檢視cpu核心數
ps aux | grep nginx #兩個程序在幹活,work的數量。
root 7404 0.0 0.1 45964 1136 ? Ss 14:13 0:00 nginx: master process nginx
nginx 7405 0.0 0.2 48500 2520 ? S 14:13 0:00 nginx: worker process
root 7535 0.0 0.0 112676 984 pts/0 R+ 14:25 0:00 grep --color=auto nginx
1、優化Nginx并發量
http_load,webbeach,siege也是壓力測試軟體可以測試伺服器壓力,根據情況自行選擇
ab -n 2000 -c 2000 http://192.168.4.5/
socket: Too many open files (24) //提示打開檔案數量過多
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2; //啟動nginx時打開的程序預設為1;調成與CPU核心數量一緻
error_log /var/log/nginx.error_log info; //定義日志檔案級别為資訊
events {
worker_connections 65535; //每個worker最大并發連接配接數預設為1024
小了就被限制死了,大點可以達到它的最大值
//最大并發量為兩個相乘法 2*65535
use epoll;
}
nginx -s reload
2、調整系統本身限制:
selinux 對最大打開檔案數量有限制預設1024個。
2000個人通路就要同時打開2000個頁面給用戶端很容易突破1024個。
ulimit -a
open files (-n) 1024
軟限制和硬限制之間普通使用者可以自調 軟限制(預設值)可以超硬限制不能超
ulimit -Hn 100000 //設定硬限制(臨時規則)
ulimit -Sn 100000 //設定軟限制(臨時規則)
vim /etc/security/limits.conf #security安全性
#使用者或組 硬限制或軟限制 需要限制的項目 限制的值
* soft nofile 100000
* hard nofile 100000
ab -n 2000 -c 2000 http://192.168.4.5/
解決用戶端通路頭部資訊過長的問題
414 Request-URI Too Large 緩存太小存不下發送過來的請求。
優化前:
vim lnmp_soft/buffer.sh //寫個測試頭檔案腳本
#!/bin/bash
URL=http://192.168.4.5/index.html
for i in {1..500}
do
URL=${URL}/v$i=$i
//第一次循環在初值後面加v1=1,二次加v2=2 類推;“=”無特殊意義!!
done
curl $URL //經過500次循環後,生成一個長的URL位址欄
./buffer.sh
<center>414 Request-URI Too Large</center> //提示頭部資訊過大
步驟:
修改vim /usr/local/nginx/conf/nginx.conf
http {
client_header_buffer_size 1k; //預設請求標頭資訊的緩存
large_client_header_buffers 4 4k; //大請求標頭部資訊的緩存個數與容量(16k)
.. .. //先根據預設的配置設定,不夠再根據large值配置設定 上班推薦值
}
nginx -s reload
./buffer.sh 5000次好像還是不夠-_-.
以Firefox浏覽器為例,在Firefox位址欄内輸入about:cache将顯示Firefox浏覽器的緩存資訊
點選List Cache Entries可以檢視詳細資訊。
浏覽器緩存(隻适合靜态資料圖檔視訊音頻)
清空firefox本地緩存資料
vim /usr/local/nginx/conf/nginx.conf
#在虛拟主機server中加入
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; //定義用戶端緩存時間為30天
} //如果比對到位址欄為以上這些靜态資料資訊則浏覽器過期時間為30天
cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html
nginx -s reload
firefox http://192.168.4.5/day.jpg
在Firefox位址欄内輸入about:cache,檢視本地緩存資料,檢視是否有圖檔以及過期時間是否正确。
自定義報錯頁面
常見http狀态碼
200 為新加載 一切正常
300 重定向類
301 永久重定向
302 臨時重定向
304 為已緩存
400 使用者方面的錯誤
401 使用者名或密碼錯誤
403 禁止通路(ip被禁)
403 資源不可用,伺服器上目錄或檔案權限設定導緻
404 頁面不存在
414 請求頭部資訊過長
500 伺服器内部錯誤
502 bad getaway:一定是作了代理兩個背景web都挂了就會報這個
firefox http://192.168.4.5/xxxxx //通路一個不存在的頁面
vim /usr/local/nginx/conf/nginx.conf
server中location外 有預設模闆 改改就行
server {
error_page 404 /40x.html; //去掉注釋改個頁面
error_page 403 /403x.html;
error_page 414 /414x.html; //想自定義的都可以
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
vim /usr/local/nginx/html/40x.html //生成錯誤頁面
nginx -s reload
firefox http://192.168.4.5/xxxxx //通路一個不存在的頁面
檢視伺服器狀态資訊 --with-http_stub_status_module
編譯安裝時使用--with-http_stub_status_module開啟狀态頁面子產品
vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
allow ip; ip 寫自己的ip位址 自己能看伺服器的狀态
deny all;
}
curl http://192.168.4.5/status
Active connections:目前活動的連接配接數量。
//server Accepts:已經接受用戶端的連接配接總數量(握手的數量)連接配接就是通道。
一次握手(連接配接)多次請求。建立連接配接之後不會立刻斷開,可以多次請求。
長時間(timeout)沒有請求連接配接自動斷開。
Accepts:已經接受用戶端的連接配接總數量。
Handled:已經處理用戶端的連接配接總數量(一般與accepts一緻,除非伺服器限制了連接配接數量)。
Requests:用戶端發送的請求數量。
Reading:目前伺服器正在讀取用戶端請求頭的數量。
Writing:目前伺服器正在寫響應資訊的數量。
Waiting: 開啟keep-alive的情況下,這個值等于 active – (reading + writing)
意思就是Nginx已經處理完成,正在等候下一次請求指令的駐留連接配接.
是以,在通路效率高,請求很快被處理完畢的情況下,Waiting數比較多是正常的
.如果reading +writing數較多,則說明并發通路量非常大,正在處理過程中.
對頁面進行壓縮處理
目前所有浏覽器支援解壓動作 但是不支援rar
網頁壓縮通常為gzip
小檔案不要壓縮,會壓縮得更大,最少1000位元組。
linux下1-9選擇數字月大效果越好壓得越慢。
jpg,mp3,mp4,gif,等多媒體檔案不要壓縮,已經是壓縮格式了。
壓縮最适合文檔,ape無損音樂。
cat /usr/local/nginx/conf/mime.types
對什麼類型壓縮參考這個檔案 有擴充名對應的類型碼。
vim /usr/local/nginx/conf/nginx.conf
http {
.. ..
gzip on; //開啟壓縮
gzip_min_length 1000; //小檔案不壓縮
gzip_comp_level 4; //壓縮比率
gzip_types text/plain text/css application/json
application/x-javascript text/xml application/xml application/xml+rss application/javascript;
//對特定檔案壓縮,類型參考mime.types
.. ..
}
伺服器記憶體緩存:
如果需要處理大量靜态檔案,可以将檔案緩存在記憶體,下次通路會更快。
http {
open_file_cache max=2000 inactive=20s;
//設定伺服器最大緩存2000個檔案句柄關掉20s之内沒有請求的檔案。
open_file_cache_valid 60s;
//有效緩存時間為60s 60秒後過期
open_file_cache_min_uses 5;
// 最少被通路5次才會被認為是熱點資料 才會緩存。
open_file_cache_errors off;
}
優化Nginx服務的安全配置
without-http_autoindex_module \ //禁用自動索引檔案目錄子產品
沒有index.html 就列出該目錄所有檔案的清單 這就是我們之前搭的http為什麼能夠直接通路rhel7 和cla***oom的原因???
without-http_ssi_module 禁用支援伺服器端的include。
修改版本資訊,并隐藏具體的版本号
vim /usr/local/nginx/conf/nginx.conf
server_tokens off; //在http下面手動添加這麼一行
nginx -s reload
curl -I http://192.168.4.5
Server: nginx
伺服器還是顯示了使用的軟體為不顯示為nginx
[root@proxy nginx-1.12]# vim +48 src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;
//修改完成後,再去編譯安裝Nignx,版本資訊将不再顯示為Nginx,而是Jacob
./configure
make && make install
killall nginx
/usr/local/nginx/sbin/nginx //啟動服務
curl -I http://192.168.4.5 //檢視版本資訊驗證
Server: haha
總結:實際上生産環境就直接改掉這src下的檔案再安裝再在http下加server_tokens off;兩個都改
内置預設ngx_http_limit_req_module子產品 需要有人拿小本子記領禮物了沒有 不然人家走一圈又來領一次 用記憶體記錄
//降低DDOS×××的風險
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; //這個是寫在http裡
limit_req_zone zone=one:10m //限制請求記憶體空間 記憶體的區域取名叫one大小:10m
$binary_remote_addr //記憶體裡放的是遠端的ip位址
rate=1r/s; //速度為每秒隻接受1個請求
limit_req zone=one burst=5; 調用上面的記憶體 最多充滿5個 漏鬥中最多放5個 //這個寫在server端口下面
//最多處理6個請求
ab -c 1000 -n 10000 http://192.168.2.111/
Failed requests: 9994
//發現丢了9994個包隻成功了前6個 是因為同時隻能請求6個。
預設為get方法
常用的就隻有get 和post (送出上傳檔案或表單)
curl -i -X GET http://192.168.4.5
//-i選項:通路伺服器頁面時,顯示HTTP的頭部資訊 隻有這個就既頭部又要頁面
//-X選項:指定請求伺服器的方法
curl -i -X HEAD 192.168.2.111 隻要頭部資訊不要其他
在server的listen 80; 後面加上這段
(監聽到80端口就判斷如果請求方法不是get或者post就傳回444報錯)
if 空($request_method空 !~ 空^(GET|POST)$空 ) 空{
return 444; 一定要注意這幾個空格啊!!!!
curl -i -X HEAD 192.168.2.111
curl: (52) Empty reply from server 報錯了。
http{
client_body_buffer_size 1K; 身體内容
client_header_buffer_size 1k; 頭部資訊
client_max_body_size 1k;
large_client_header_buffers 2 1k;
… …
} 之前寫過一個一直循環通路位址的腳本也就是這個!www.a.com/d/a/b/b/d/d/d/d/無限加下去
這個不好驗證 但是必須要有!!!