天天看點

linux進階運維之nginx

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/無限加下去

            這個不好驗證 但是必須要有!!!           

繼續閱讀