1. 程式人生 > >【最全】Nginx安裝與優化

【最全】Nginx安裝與優化

Nginx安裝

一、 安裝依賴包

1. Ubuntu平臺

安裝gcc g++的依賴庫

apt-get install build-essential
apt-get install libtool

安裝 pcre依賴庫

cd /usr/local/src                                                           注:在src目錄下操作
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz 注:下載安裝包
tar -zxvf pcre-8.41
.tar.gz 注:解壓檔案 cd pcre-8.41 注:進入檔案目錄 ./configure make make install

安裝 zlib依賴庫

apt-get install zlib1g-dev

安裝 ssl依賴庫

apt-get install openssl
apt-get install libssl-dev

2. Centos平臺

yum -y
install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

再按照Ubuntu方法安裝pcre依賴庫

二、 安裝Nginx

  1. 下載安裝包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.12.1.tar.gz        注:下載Nginx,最新版本自行官網檢視
tar zxvf nginx-1.12.1.tar.gz                              注:解壓安裝包
cd nginx-1.12.1                                           注:進入安裝目錄
  1. 編譯安裝
注:安裝在/usr/local/nginx,注意修改pcre目錄。
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41         
make
make install

三、 Nginx配置

  1. 建立 Nginx 執行使用的使用者 nginx
/usr/sbin/groupadd nginx
/usr/sbin/useradd -g nginx nginx
  1. 修改配置檔案
    備份原配置檔案
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak

配置nginx.conf ,將/usr/local/nginx/conf/nginx.conf改為以下內容

vi /usr/local/nginx/conf/nginx.conf
user nginx nginx;                             #配置使用者或者組
worker_processes auto;                        
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;                   #與ulimit -n 的值保持一致
events
{
    multi_accept on;                      #設定一個程序是否同時接受多個網路連線,預設為off
    use epoll;                            #高效能網路I/O模型,不用管
    worker_connections 65535;             #單個程序最大連線數(最大連線數=連線數*程序數),與ulimit -n 的值一致即可
}
http{
    server_tokens off;                    #關閉在錯誤頁面中的nginx版本數字
    sendfile on;                          #進行下載等應用磁碟IO重負載應用,可設定為 off
    #autoindex on;                        #目錄列表訪問,下載伺服器設定,預設不設定

    error_log /usr/local/nginx/logs/error.log crit;   #記錄嚴重的錯誤,注意修改路徑
    log_format access escape=json '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    access_log /usr/local/nginx/logs/access.log access;     #記錄訪問日誌,上面為日誌訪問格式

    keepalive_timeout 1800;               #長連線超時時間,掃碼設定為1800
    keepalive_requests 500;               #每個長連線最大請求數

    limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;#設定IP限速
    limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=50r/s;    #每個 IP 地址每秒最大處理 50 個請求

    include       mime.types;             #呼叫樣式
    #include       blocksip.conf;         #配置禁用訪問ip,預設進行關閉,需要自行配置
    default_type application/octet-stream;
    server_names_hash_bucket_size 128;    #伺服器名字的hash表大小
    client_header_buffer_size 32k;        #客戶端請求頭部的緩衝區大小,預設這樣就行
    large_client_header_buffers 4 64k;    #客戶請求頭緩衝大小,預設就行
    client_max_body_size 100m;            #設定通過nginx上傳檔案的大小,需要上傳檔案的注意這個引數

    gzip on;                              #採用資料壓縮
    gzip_min_length 1k;                   #最小壓縮檔案大小
    gzip_buffers     4 16k;               #壓縮緩衝區
    gzip_http_version 1.0;                #壓縮版本
    gzip_comp_level 4;                    #壓縮等級
    gzip_types       text/plain application/x-javascript text/css application/xml;    #壓縮型別
    gzip_vary on;

    ##快取cache引數配置
    proxy_connect_timeout 5;              #與後端程式連線超時時間,單位為秒
    proxy_read_timeout 60;                #讀取後端程式超時時間,掃碼業務設定為1800,注意
    proxy_send_timeout 5;                 #向後端傳送超時時間
    proxy_buffer_size 16k;
    proxy_buffers 4 64k; 
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    #快取到nginx的本地目錄
    proxy_temp_path  /usr/local/nginx/html/nginx_temp;    #設定快取臨時目錄
    proxy_cache_path /usr/local/nginx/html/nginx_temp/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
    #設定快取資料夾;keys_zone快取空間名; inactive檔案1天內沒有被訪問就刪除,max_size快取佔用最大空間為10G

    upstream backend
    {
        server 192.168.18.19:8080;            #設定代理地址
        server 192.168.18.19:8089;            #設定代理地址
        keepalive 16;                         #啟動後端長連線
    }

    server {
        listen 9000;                      #監聽埠
        server_name hbsm.xinli.com.cn;    #監聽地址,域名可以有多個,用空格隔開
        root html;       #根目錄
        index index.php index.htm index.html;     #預設頁

        #動態請求代理給相應伺服器
        location / {
            #include     agent_deny.conf;                   #遮蔽爬蟲攻擊,需要外部配置,預設關閉,配置好外部配置開啟
            limit_req zone=ConnLimitZone burst=100 nodelay; #設定限速200個排隊
            limit_conn  TotalConnLimitZone  100;            #限制每個IP只能發起100個併發連線
            proxy_set_header Host  $host;
            proxy_set_header X-Forwarded-For  $remote_addr; 
            proxy_redirect off;
            proxy_http_version 1.1;                         #設定Http協議版本
            proxy_pass http://backend;                      #轉向定義服務列表
                            }
        #快取相應的檔案(靜態檔案) 
        location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) { 
            #include     agent_deny.conf;                   #遮蔽爬蟲攻擊,需要外部配置,預設關閉,配置好外部配置開啟   
            proxy_pass http://backend;                      #如果沒有快取則通過proxy_pass轉向請求
            #proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;    #強制快取,部分應用會不讓靜態頁面快取,此方法可以強制快取靜態頁,預設關閉
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_cache cache_one;                          #設定快取共享記憶體區塊,也就是keys_zone名稱
            proxy_cache_valid 200 302 1h;                   #對不同的HTTP狀態碼設定不同的快取時間,h小時,d天數
            proxy_cache_valid 301 1d;
            proxy_cache_valid any 1m;
            expires 7d;                                     #設定使用者本地快取檔案失期時間
                            }  
        }


    }

附件配置

  1. 遮蔽帶有某關鍵詞的url訪問(在server下面加入)
#遮蔽帶有關鍵詞/getCCHelpDownloadInfo的url
location ~ /getCCHelpDownloadInfo {
        return 403;
        access_log off;         #此類訊息不加入日誌
        }
  1. 防止爬蟲
vi /usr/local/nginx/conf/agent_deny.conf
#禁止URL帶有“&url=”的關鍵詞訪問
if ($request ~* (&url=|qq.com|kugou.com)) {
     return 403;
     access_log off;         #此類訊息不加入日誌
}

#禁止Scrapy等工具的抓取,注意是否遮蔽了監控
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
     return 403;
     access_log off;         #此類訊息不加入日誌
}

#禁止指定UA及UA為空的訪問
if ($http_user_agent ~ "COOCAREHTTPULPADAGENT|WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) {
     return 403;
     access_log off;         #此類訊息不加入日誌
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
    access_log off;         #此類訊息不加入日誌
}

#修改設定cookies,多層判斷示例,nginx不支援巢狀判斷
if ($request ~ &version=6.0&) {
     set $iftm Y;
}
if ($http_user_agent !~* (Android/6.0/)) {
     set $iftm "${iftm}Y";
}

if ($iftm = YY) {
    #return 201 'into responseToauth00';
    #add_header Set-Cookie 'Key=system';
    #access_log off;         #此類訊息不加入日誌
}
然後在nginx.conf的location中加入
include     agent_deny.conf;

配置輪詢方式

  1. 輪詢(預設)
    每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
  2. weight
    指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
    例如:
upstream backend {
  server 192.168.0.14 weight=10;
  server 192.168.0.15 weight=10;
}
  1. ip_hash
    每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
    例如:
upstream backend {
  ip_hash;
  server 192.168.0.14:88;
  server 192.168.0.15:80;
}
  1. fair(第三方)
    按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
  server server1.linuxany.com;
  server server2.linuxany.com;
  fair;
}
  1. url_hash(第三方)
    按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。例:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法
upstream backend {
  server squid1:3128;
  server squid2:3128;
  hash $request_uri;
  hash_method crc32;
}

檢查配置的正確性

/usr/local/nginx/sbin/nginx -t

設定nginx目錄使用者

cd /usr/local/
chown -R nginx:nginx nginx/
chmod -R 755 nginx/

設定nginx黑名單

vi /usr/local/nginx/conf/blocksip.conf
deny 47.88.226.12; 
allow all;

四、 啟動Nginx

/usr/local/nginx/sbin/nginx
ps -ef |grep nginx                     注:檢視是否啟動

image

Nginx 其他命令

/usr/local/nginx/sbin/nginx -s reload            # 重新載入配置檔案
/usr/local/nginx/sbin/nginx -s reopen            # 重啟 Nginx
/usr/local/nginx/sbin/nginx -s stop              # 停止 Nginx

加入服務

vi /etc/init.d/nginx                              # 編輯指令碼

指令碼內容

#!/bin/bash
#nx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
   echo "nginx already running...."
   exit 1
fi
   echo -n $"Starting $prog: "
   daemon $nginxd -c ${nginx_config}
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
   return $RETVAL
}
# Stop nginx daemons functions.
stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}
# See how we were called.
case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
reload)
        reload
        ;;
restart)
        stop
        start
        ;;
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $"Usage: $prog {start|stop|restart|reload|status|help}"
        exit 1
esac
exit $RETVAL
chmod a+x /etc/init.d/nginx                    #賦予指令碼執行許可權
ubuntu加入系統服務
update-rc.d nginx defaults

centos加入系統服務
chkconfig --add nginx
chkconfig nginx on
service nginx start                            #啟動nginx
service nginx stop                             #停止nginx
service nginx restart                          #停止nginx

五、 測試Nginx

瀏覽器訪問伺服器ip+埠檢視是否能訪問網頁,重新整理看是否能切換到不同網頁。

六、 Nginx狀態碼說明

200    正常
304    已經快取,不用去伺服器取
499    使用者主動斷開,常見使用者獲取二維碼後關閉了客戶端
504    nginx把連線主動斷開了,檢視設定的超時時間