天天看點

nginx看這篇就夠了

LK最近在部署項目的時候了解到項目架構中使用到了ngnix負載均衡,雖然使用的是阿裡雲的負載均衡服務,但是LK還是想深入了解一下nginx,主要有一下知識總結:

1.nginx是什麼

2.nginx優點

3.nginx安裝和部署

4.nginx負載均衡和反向代理

5.nginx+tomcat+keepalived

1.nginx是什麼

  • NGINX有什麼不同? NGINX使用可擴充的事件驅動架構,而不是更傳統的過程驅動架構。 這需要更低的記憶體占用,并且當并發連接配接擴大時,使記憶體使用更可預測。
  • 在傳統的Web伺服器體系結構中,每個用戶端連接配接作為一個單獨的程序或線程處理,随着網站的流行度增加,并發連接配接數量的增加,Web伺服器減慢,延遲了對使用者的響應。
  • 從技術的角度來看,産生一個單獨的程序/線程需要将CPU切換到新的任務并建立一個新的運作時上下文,消耗額外的記憶體和CPU時間,進而對性能産生負面影響。
  • NGINX開發的目标是實作10倍以上的性能,優化伺服器資源的使用,同時也能夠擴充和支援網站的動态增長。 是以,NGINX成為最知名的子產品化,事件驅動,異步,單線程Web伺服器和Web代理之一。

2.nginx優點

  • 作為 Web 伺服器:相比 Apache,Nginx 使用更少的資源,支援更多的并發連接配接,展現更高的效率,這點使 Nginx 尤其受到虛拟主機提供商的歡迎。能夠支援高達 50,000 個并發連接配接數的響應,感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發模型.
  • 作為負載均衡伺服器:Nginx 既可以在内部直接支援 Rails 和 PHP,也可以支援作為 HTTP代理伺服器 對外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
  • 作為郵件代理伺服器: Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個産品的目的之一也是作為郵件代理伺服器),Last.fm 描述了成功并且美妙的使用經驗

3.nginx安裝和部署

一、安裝Nginx:

  1. wget下載下傳: http://nginx.org/download/nginx-1.4.2.tar.gz
  2. 進行安裝: tar -zxvf nginx-1.4.2.tar.gz
  3. 下載下傳鎖需要的依賴庫檔案:

    yum install pcre

    yum install pcre-devel

    yum install zlib

    yum install zlib-devel

  4. 進行configure配置:cd nginx-1.4.2 && ./configure --prefix=/usr/local/nginx 檢視是否報錯
  5. 編譯安裝 make && make install

    二,Nginx配置

  6. 建立 Nginx 運作使用的使用者 www:
    nginx看這篇就夠了
  7. 配置nginx.conf ,将/usr/local/nginx/conf/nginx.conf替換為以下内容

    user www www;

    worker_processes 2; #設定值和CPU核心數一緻

    error_log /usr/local/nginx/logs/nginx_error.log crit; #日志位置和日志級别

    pid /usr/local/nginx/nginx.pid;

    #Specifies the value for maximum file descriptors that can be opened by this process.

    worker_rlimit_nofile 65535;

    events

    {

    use epoll;

    worker_connections 65535;

    }

    http

    {

    include mime.types;

    default_type application/octet-stream;

    log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteu​ser[time_local] “KaTeX parse error: Double superscript at position 23: …" ' '̲status b o d y b y t e s s e n t " body_bytes_sent " bodyb​ytess​ent"http_referer” ’

    ‘"$http_user_agent" $http_x_forwarded_for’;

    #charset gb2312;

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

    client_max_body_size 8m;

    sendfile on;

    tcp_nopush on;

    keepalive_timeout 60;

    tcp_nodelay on;

    fastcgi_connect_timeout 300;

    fastcgi_send_timeout 300;

    fastcgi_read_timeout 300;

    fastcgi_buffer_size 64k;

    fastcgi_buffers 4 64k;

    fastcgi_busy_buffers_size 128k;

    fastcgi_temp_file_write_size 128k;

    gzip on;

    gzip_min_length 1k;

    gzip_buffers 4 16k;

    gzip_http_version 1.0;

    gzip_comp_level 2;

    gzip_types text/plain application/x-javascript text/css application/xml;

    gzip_vary on;

    #limit_zone crawler KaTeX parse error: Expected 'EOF', got '#' at position 28: …e_addr 10m; #̲下面是server虛拟主機的配…

    {

    #fastcgi_pass unix:/tmp/php-cgi.sock;

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_index index.php;

    include fastcgi.conf;

    }

    location ~ ..(gif|jpg|jpeg|png|bmp|swf|ico)$

    {

    expires 30d;

    #access_log off;

    }

    location ~ ..(js|css)?$

    {

    expires 15d;

    #access_log off;

    }

    access_log off;

    }

    }

  8. 檢查配置檔案nginx.conf的正确性指令:
nginx看這篇就夠了
  1. 啟動Nginx:

    cd /usr/local/nginx目錄下: 看到如下4個目錄

    …conf 配置檔案

    … html 網頁檔案

    …logs 日志檔案

    …sbin 主要二進制程式

啟動指令:/usr/local/nginx/sbin/nginx -s start 關閉(stop)重新開機(reload)

成功:檢視是否啟動(netstat -ano | grep 80)

失敗:可能為80端口被占用等。

最終

nginx看這篇就夠了

nginx已經啟動 無法通路頁面

問題不是出在nginx上,而是出在iptable上,在iptable上添加80端口

#vi /etc/sysconfig/iptables

//在倒數第二行加入80端口

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

//重新開機iptables

#/etc/init.d/iptables restart

重新開機會報如下錯誤:

nginx看這篇就夠了

解決方法:

nginx看這篇就夠了

重新啟動nginx會報如下錯:

nginx看這篇就夠了

執行如下指令會生成nginx.pid檔案,但會報如下錯:

[[email protected] ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] still could not bind()

執行 killall -9 nginx 殺死80程序

重新執行

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

檢視nginx是否啟動

ps -ef | grep nginx

4.nginx負載均衡和反向代理

#設定負載均衡的伺服器清單

#upstream myproject {

#weigth參數表示權值,權值越高被配置設定到的幾率越大

#max_fails 當有#max_fails個請求失敗,就表示後端的伺服器不可用,預設為1,将其設定為0可以關閉檢查

#fail_timeout 在以後的#fail_timeout時間内nginx不會再把請求發往已檢查出标記為不可用的伺服器

#}

#webap

#upstream myapp {

#server 192.168.43.132:8080 weight=1 max_fails=2 fail_timeout=30s;

#server 192.168.43.90:8080 weight=1 max_fails=2 fail_timeout=30s;

#}

#傳回的相應檔案位址

location / {

#設定用戶端真實ip位址

#proxy_set_header X-real-ip $remote_addr;

#負載均衡反向代理

#proxy_pass http://myapp;

#傳回根路徑位址(相對路徑:相對于/usr/local/nginx/)

root html;

#預設通路檔案

index index.html index.htm;

}

運作結果:

nginx看這篇就夠了

5.nginx+tomcat+keepalived

  • 第一步:下載下傳keepalived位址:http://www.keepalived.org/download.html

    解壓安裝:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/

    yum install -y openssl openssl-devel(需要安裝一個軟體包)

    cd keepalived-1.2.18/ && ./configure -prefix=/usr/local/keepalived

    make && make install

  • 第二步:将keepalived安裝成Linux系統服務,因為沒有使用keepalived的預設安裝路徑(預設路徑:/usr/local),安裝完成之後,需要做一些修改工作:

    首先建立檔案夾,将keepalived配置檔案進行複制:mkdir /etc/keepalived

    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

    然後複制keepalived腳本檔案:

    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

    ln -s /usr/local/sbin/keepalived /usr/sbin/

    ln -s /usr/local/keepalived/sbin/keepalived /sbin/可以設定開機啟動: ,到此我們安裝完畢!

  • 第三步:對配置檔案進行修改:vim /etc/keepalived/keepalived.confkeepalived.conf配置檔案說明:
  • (一)Master

    iglobal_defs {

    notification_email {

    [email protected]

    }

    notification_email_from [email protected]

    smtp_server smtp.hysec.com

    smtp_connection_timeout 30

    router_id nginx_master # 設定nginx master的id,在一個網絡應該是唯一}.

    vrrp_script chk_http_port {

    script “/etc/keepalived/nginx_check.sh” #最後手動執行下此腳本,以確定此本能夠正常執行

    interval 2 #(檢測腳本執行的間隔,機關是秒)

    weight 2

    }

    vrrp_instance VI_1 {

    state MASTER # 指定keepalived的角色,MASTER為主,BACKUP為備

    interface eth1 # 目前進行vrrp通訊的網絡接口卡(目前centos的網卡)

    virtual_router_id 66 # 虛拟路由編号,主從要一直

    priority 100 # 優先級,數值越大,擷取處理請求的優先級越高

    advert_int 1 # 檢查間隔,預設為1s(vrrp多點傳播周期秒數)

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    chk_http_port #(調用檢測腳本)

    }

    virtual_ipaddress {

    192.168.0.200 # 定義虛拟ip(VIP),可多設,每行一個

    }

    }

  • (二)Backup!

    bal_defs {

    notification_email {

    [email protected]

    }

    notification_email_from [email protected]

    smtp_server smtp.hysec.com

    smtp_connection_timeout 30

    router_id nginx_backup # 設定nginx backup的id,在一個 絡應該是唯一的

    }

    vrrp_script chk_http_port {

    script “/etc/keepalived/nginx_check.sh”

    interval 2 #(檢測腳本執行的間隔)

    weight 2

    }

    vrrp_instance VI_1 {

    state BACKUP # 指定keepalived的角色,MASTER 主,BACKUP為備

    interface eth0 # 目前進行vrrp通訊的網絡接口卡(> 目前centos的網卡)

    virtual_router_id 66 # 虛拟路由編号,主從要一直

    priority 99 # 優先級,數值越大,擷取處理請 的優先級越高

    advert_int 1 # 檢查間隔,預設為1s(vrrp多點傳播周> 期秒數)

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    chk_http_port #(調用檢測腳本)

    }

    virtual_ipaddress {

    192.168.0.200 # 定義虛拟ip(VIP),可多設,每行> 一個

    }

    }

  • (三)

    !/bin/bash

    A=

    ps -C nginx --no-header |wc -l

    if [ $A -eq 0 ];then

    /usr/local/nginx/sbin/nginx #重新開機nginx

    if [

    ps -C nginx --no-header |wc -l

    -eq 0 ];then #nginx重新開機失敗

    exit 1

    else

    exit 0

    fi

    else

    exit 0

    fi

    ~

    ~

  • (四)我們需要把master的keepalived配置檔案 copy到master機器(172)的 /etc/keepalived/ 檔案夾下,在把backup的keepalived配置檔案copy到backup機器(173)的 /etc/keepalived/ 檔案夾下,最後把nginx_check.sh腳本分别copy到兩台機器的 /etc/keepalived/檔案夾下。
  • (五)nginx_check.sh腳本授權。賦予可執行權限:chmod +x /etc/keepalived/nginx_check.sh
  • (六)啟動2台機器的nginx之後。我們啟動兩台機器的

keepalived /usr/local/nginx/sbin/nginx

service keepalived start

ps -ef | grep nginx

ps -ef | grep keepalived

運作結果:

nginx看這篇就夠了

繼續閱讀