Nginx環境搭建和配置

Nginx安裝配置

Nginx也是一款服務器,我們常用它做如:反向代理、負載均衡、動態與靜態資源的分離的工作,這裏就不過多介紹了,這篇博客介紹的十分詳細:Nginx相關介紹
跨平臺、配置簡單,非阻塞、高併發連接:處理2-3萬併發連接數,官方監測能支持5萬併發
Nginx優點
1、高併發連接
2、內存消耗少
3、配置文件非常簡單
4、成本低廉
5、支持Rewrite重寫規則
6、內置的健康檢查功能
7、節省帶寬
8、穩定性高

Nginx支持熱部署,幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動。能夠在不間斷服務的情況下,對軟件版本進行進行升級。Nginx的配置文件非常簡單,風格跟程序一樣通俗易懂,能夠支持perl語法。使用nginx –s reload可以在運行時加載配置文件,便於運行時擴容/減容。重新加載配置時,master進程發送命令給當前正在運行的worker進程worker進程接到命令後會在處理完當前任務後退出。同時,master進程會啓動新的worker進程來接管工作。

我這裏系統是centos,如果是其他系統命令會有些不同,流程是一樣的,當然用docker直接pull鏡像是很方便的,該配置就有些不同

1、在線安裝
yum install nginx

安裝好的文件位置如下:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放靜態文件
/var/log/nginx:存放日誌

通過這種方式安裝的,會自動創建服務,會自動在/etc/init.d/nginx新建服務腳本,然後就可以使用如下命令進行操作:
service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

如果你想改它的配置文件地方,那麼就還是本地解壓安裝吧

  1. 離線安裝
    注1:官網的步驟是通過命令行配置Nginx文件,將 openssl、pcre、zlib 一起編譯安裝的,但是這樣一旦出錯,不容易解決,所以最好單獨編譯安裝
    注2:因爲後面使用第三方擴展模塊ngx_cache_purge,必須使用nginx的安裝源文件,而離線方式是不存在的,只有deb文件

         # 一、安裝nginx所需依賴庫   
         # 安裝gcc g++的依賴庫    
           yum install build-essential  
       
           yum install libtool
         # 安裝pcre依賴庫
           yum install libpcre3 libpcre3-dev
         # 安裝zlib依賴庫
           yum install zlib1g-dev
         # 安裝SSL依賴庫(16.04默認已經安裝了,有些版本的linux是沒有安裝)
           yum install openssl
             
         # 二、下載並解壓安裝包
         # 官方下載頁面:http://nginx.org/en/download.html
         # configure配置文件詳解:http://nginx.org/en/docs/configure.html
         # wget http://nginx.org/download/nginx-1.14.2.tar.gz             
         cd /usr/local/mytools
         # 上傳並解壓離線安裝包
         pscp d:/temp/nginx-1.14.2.tar.gz [email protected]:/usr/local/mytools
         tar -zxvf nginx-1.14.2.tar.gz
    
         # 三、安裝Nginx
         # 進入解壓目錄
         cd nginx-1.14.2
         # 配置:--prefix指定nginx的安裝路徑
         ./configure --prefix=/usr/local/nginx  
         # 編譯:
         make
         # 安裝
         make install
         注1:安裝好的文件位置如下:
              /usr/local/nginx/sbin/nginx:主程序
              /usr/local/nginx/conf/nginx.conf:存放主配置文件
              /usr/local/nginx/html:存放靜態文件
              /usr/local/nginx/logs:存放日誌
         # 啓動:
         /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf                
         注1:-c 指定配置文件的路徑,不加的話,nginx會自動加載默認路徑的配置文件。
         注2:啓動成功後可將瀏覽器輸入http://服務器IP:80/即可看到nginx歡迎頁面     
         
         #查看進程:
         ps -ef | grep nginx 
    
         # 四、創建Nginx自動啓動腳本
         cd /etc/init.d                 # 進入/etc/init.d目錄
         touch nginx                    # 創建腳本文件nginx,將資料“nginx配置方案及啓動腳本/nginx”文件中的內容複製進來
         chmod a+x nginx                # a+x 是給所有人加上可執行權限,包括所有者,所屬組,和其他人
        chkconfig --add nginx
     	chkconfig nginx on
         
         # 常用的命令如下
         service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}  
    

至於啓動配置文件,長了,自己去百度了,這裏就不發了

如果你配置不了自動啓動腳本,那麼就用原生態的就好了

開啓
/usr/local/nginx/sbin/nginx

重啓:
/usr/local/nginx/sbin/nginx -s reload

停止:
/usr/local/nginx/sbin/nginx -s stop

測試配置文件是否正常,這行命令是非常重要的,配置出錯就靠它來排查:
/usr/local/nginx/sbin/nginx -t

在下載環境的時候可能會報錯,如果是下列錯誤,那麼就解決了
nginx error: the HTTP rewrite module requires the PCRE library.

安裝pcre-devel解決問題
yum -y install pcre-devel

錯誤提示:./configure: error: the HTTP cache module requires md5 functions…
yum -y install openssl openssl-devel

然後我們這些配置好就通過 ip +80端口 能訪問我們的nginx了
在這裏插入圖片描述

配置負載均衡

這是我最後修改完畢的配置文件,並加上了註解以便理解
nginx的主配置文件結構

#定義Nginx運行的用戶和用戶組2
user root;

# nginx進程數,通常設置成和cpu的數量相等
worker_processes 1;

# 全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
# nginx.conf裏會有兩個日誌,分爲access.log 和 error.log
# access.log主要是記錄"誰來登陸了,從哪裏登陸的,登陸後發生了什麼",具體格式可以在nginx.conf裏設定
# error.log主要記錄的是檢查nginx.conf裏發現的錯誤,模式不支持自定義
# 當打開error.log的時候,可能會看到各種樣的內容,比如:
# 2018/05/03 10:20:51 [emerg] 20952#0: unexpected "}" in /usr/local/nginx/conf/nginx.conf:87
# 這句話就說明在nginx.conf的87行裏有一個 } 是錯誤的,檢查一下}是不是多餘了,或者;少了,這個錯誤的級別是emergency
error_log /usr/local/nginx/logs/error.log info;

# 進程pid文件
# pid /var/log/nginx/nginx.pid; 
# 上面的配置會造成ngix找不到pid文件,換成下面的配置即可
pid /var/run/nginx.pid;

# 指定進程可以打開的最大描述符:數目
worker_rlimit_nofile 65535;

# 設置工作模式
events {
  # epoll是多路複用IO(I/O Multiplexing)中的一種方式,
  # 僅用於linux2.6以上內核,可以大大提高nginx的性能
  # 內核版本查看命令:cat /proc/version
  use epoll;

  # 定義每個進程的最大連接數,受系統進程的最大打開文件數量限制
  # 單個進程最大連接數(最大連接數=連接數*進程數)
  # 根據硬件調整,和前面工作進程配合起來用,儘量大,但是別把cpu跑到100%就行
  worker_connections 65535;
}


# 設定http服務器
http {
  # 文件擴展名與文件類型映射表
  include mime.types;

  # 默認文件類型
  default_type application/octet-stream;

  # 默認編碼,Nginx的頁面中文亂碼解決
  charset utf-8;

  # 隱藏Nginx版本號
  server_tokens off;

  # 設定日誌格式
  # 爲了觀察緩存的命中狀態,我們可以將緩存相關的變量記錄在日誌中。
  # nginx.conf中配置(在行尾加上'"$upstream_cache_status"'緩存命中狀態即可)
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
		  '"$http_user_agent" "$http_x_forwarded_for" "$upstream_cache_status"';

  # 設定日誌位置,建議生產階段關閉
  access_log /usr/local/nginx/logs/access.log main;

  # 開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
  # sendfile: 設置爲on表示啓動高效傳輸文件的模式。sendfile可以讓Nginx在傳輸文件時直接在磁盤和tcp socket之間傳輸數據。如果這個參數不開啓,會先在用戶空間(Nginx進程空間)申請一個buffer,用read函數把數據從磁盤讀到cache,再從cache讀取到用戶空間的buffer,再用write函數把數據從用戶空間的buffer寫入到內核的buffer,最後到tcp socket。開啓這個參數後可以讓數據不用經過用戶buffer
  #sendfile on;
  sendfile off;
  # 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
  #tcp_nopush on;

  # 連接超時時間單位是秒,這裏指的是http層面的keep-alive 並非tcp的keepalive
  keepalive_timeout 120;
  tcp_nodelay on;

  # 設定請求緩衝
  client_header_buffer_size 32k;
  large_client_header_buffers 4 64k;

  # 保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。
  # 參數hash bucket size總是等於hash表的大小,並且是一路處理器緩存大小的倍數。
  # 在減少了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。
  # 如果hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,
  # 最壞的情況下在內存中查找的次數爲2。第一次是確定存儲單元的地址,
  # 第二次是在存儲單元中查找鍵 值。因此,如果Nginx給出需要增大hash max size 或 
  # hash bucket size的提示,那麼首要的是增大前一個參數的大小.
  server_names_hash_bucket_size 128;

  # http_proxy設置
  proxy_redirect off;
  # 請求頭中Host信息
  proxy_set_header HOST $host;
  # 真實的客戶端IP
  proxy_set_header X-Real-IP $remote_addr;
  # 代理路由信息,此處取IP有安全隱患
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  # 真實的用戶訪問協議
  proxy_set_header X-Forwarded-Proto $scheme;

  # 設置通過nginx上傳文件的大小
  # 注1:通過tomcat遠程部署項目時,項目war可能比較大,這個數值可以設置大一些,發佈完項目後再改回10m
  client_max_body_size 50m; 
  # client_max_body_size 10m;          
  client_body_buffer_size 128k;
  proxy_connect_timeout 75;
  proxy_send_timeout 75;
  proxy_read_timeout 75;
  proxy_buffer_size 4k;
  proxy_buffers 4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;

  # 開啓nginx的緩存功能
  # 定義nginx緩存目錄
  # /usr/local/nginx/proxy_cache/cache緩存文件所在目錄,默認不存在,創建即可
  # level=1:2 緩存的層次結構爲2層
  # keys_zone 緩存空間名稱爲cache_one:10m,大小爲10兆
  # inactive=60m 該緩存60分鐘內沒被訪問就把清理掉
  # max_size=10g 最大文件緩存爲10G,超過10GNginx的裁判機制會剔除不經常被訪問的緩存
  # use_temp_path 如果爲off,則nginx會將緩存文件直接寫入指定的cache文件中,而不使用temp_path指定的臨時存儲路徑
  # use_temp_path=on 會生成一個臨時的.tmp緩存,會和自己定義的 /usr/local/nginx/proxy_cache/cache 緩存衝突,導致性能下降,一般關閉
  proxy_cache_path /usr/local/nginx/proxy_cache/cache levels=1:2 keys_zone=cache_one:500m inactive=60m max_size=10g use_temp_path=off;
  # 定義nginx緩存臨時目錄
  # /usr/local/nginx/proxy_cache/temp臨時文件所在目錄。此項在 use_temp_path=off 時不需填寫
  # proxy_temp_path /usr/local/nginx/proxy_cache/temp;

  # 開啓目錄列表訪問,合適下載服務器,默認關閉。
  autoindex on;



  # 這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,
  # inactive是指經過多長時間文件沒被請求後刪除緩存。
  open_file_cache max=65535 inactive=60s;
  # 這個是指多長時間檢查一次緩存的有效信息。
  open_file_cache_valid 80s;
  # open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,
  # 文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
  open_file_cache_min_uses 1;

  # gzip模塊設置
  # 開啓nginx gzip壓縮後,網頁、css、js等靜態資源的大小會大大的減少,從而可以節約大量的帶寬,
  # 提高傳輸效率,給用戶快的體驗。雖然會消耗cpu資源,但是爲了給用戶更好的體驗是值得的
  # 怎麼檢測nginx有沒有開啓gzip?
  # 通過瀏覽器查看響應頭:Accept-Encoding: 這部分是不是有gzip,有的話就是已經生效,例如:Accept-Encoding: gzip, deflate
  gzip on;
  gzip_disable "MSIE [1-6].";
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
             text/javascript application/javascript application/x-javascript
             text/x-json application/json application/x-web-app-manifest+json
             text/css text/plain text/x-component
             font/opentype application/x-font-ttf application/vnd.ms-fontobject
             image/x-icon;
  gzip_vary on;

  # 開啓限制IP連接數的時候需要使用
  #limit_zone crawler $binary_remote_addr 10m;

  # 負載均衡配置
  # 設定負載均衡後臺服務器列表
  # 在需要使用負載均衡的server中增加 proxy_pass http://server_pool;
  upstream server_pool {
    # ip_hash輪詢方式:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,
    # 可以有效解決session問題,不可給服務器加權重weight
    ip_hash;
    
    # tomcat列表
    # max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
    # fail_timeout:max_fails次失敗後,暫停的時間。

    #server 192.168.199.131:8080 weight=10; //本機ip 但不可使用此種寫法,使用下面127的寫法
    #因爲我們此時轉發到的是本機的8080端口,如果使用本機ip的話還需要進行tcp連接,
    #這時候防火牆就會把這個端口的tcp連接給攔截掉,本機也無法訪問這個ip的某一端口,使用127.0.0.1就可以完美的避開這個問題

    # 指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況
    #server 127.0.0.1:8080 weight=10;
    server 192.168.43.11:8080 weight=10;
  }

  #虛擬主機的配置
  server {
    # 監聽端口
    listen 80;

    # 域名可以有多個,用空格隔開
    # 這裏隨便寫域名或者 刪除 server_name都能正常訪問
    server_name _;

    # 必須配置開啓緩存功能的location的前面否則不生效
    # 用於清除緩存的url設置
    # 假設一個URL爲http://www.wangshibo.com/test.gif,那麼就可以通過訪問http://www.wangshibo.com/purge/test.gif清除該URL的緩存。
    #location ~ /purge(/.*) {
      #設置只允許指定的IP或IP段纔可以清除URL緩存
      #allow 127.0.0.1 ;
      #allow 192.168.0.0/16 ;
      #允許所有IP清除URL緩存 
      #allow all;
      #拒絕所有IP清除URL緩存
      #deny all ;
      #proxy_cache_purge cache_one $host$1$is_args$args ;
    #}

    # / 匹配所有路徑,默認對所有請求都做負載均衡+反向代理
    location / {
        # 可以通過添加自定義header判斷URL匹配了哪個location
        #add_header Access-Control-Location '/'; 

        #這裏server_pool指向上面名爲server_pool的upstream
	proxy_pass http://server_pool; 
    }



    # 靜態處理交給nginx
    location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|ico|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|css|js)$ {
      # 可以通過添加自定義header判斷URL匹配了哪個location
      #add_header Access-Control-Location 'js|css|images';

      # nginx對後端靜態資源做緩存
      # 使用Web緩存區cache_one,已在nginx.conf的緩存配置中命名的。
      proxy_cache cache_one;

      # 狀態碼爲200 302 304的緩存12小時,其餘的緩存10分鐘
      proxy_cache_valid 200 304 302 12h;
      proxy_cache_valid any 10m;

      # 添加自定義響應頭中定義緩存的狀態:
      # $upstream_cache_status包含以下幾種狀態:
      # MISS 未命中,請求被傳送到後端
      # HIT 緩存命中
      # EXPIRED 緩存已經過期請求被傳送到後端
      # UPDATING 正在更新緩存,將使用舊的應答
      # STALE 後端將得到過期的應答
      add_header Nginx-Cache '$upstream_cache_status from $host';

      # 如果出現以下error,或者50*的狀態碼,將會重新負載調度到另一臺服務器上重新請求(不會在一臺服務器上死磕)
      proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

      # 設置Web緩存的Key值,Nginx根據Key值md5哈希存儲緩存,這裏根據"域名,URI,參數"組合成Key
      proxy_cache_key $host$uri$is_args$args;

      # 忽略瀏覽器中的一些緩存參數,而開啓緩存
      proxy_ignore_headers Set-Cookie Cache-Control;
      proxy_hide_header Cache-Control;
      proxy_hide_header Set-Cookie;


      proxy_pass http://server_pool;
    }


    

    # 定義錯誤提示頁面,如果在web項目中已經配置500/404錯誤頁面,這裏就不用配置了
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    #}

     
    # 設定查看Nginx狀態的地址,狀態值示例如下:
    # Active connections: 11921 
    # server accepts handled requests
    #    11989 11989 11991 
    # Reading: 0 Writing: 7 Waiting: 42
    # active connections – 活躍的連接數量
    # server accepts handled requests — 總共處理了11989個連接 , 成功創建11989次握手, 總共處理了11991個請求
    # reading — 讀取客戶端的連接數.
    # writing — 響應數據到客戶端的數量
    # waiting — 開啓 keep-alive 的情況下,這個值等於 active – (reading+writing), 意思就是 Nginx 已經處理完正在等候下一次請求指令的駐留連接.
    # nginx  unknown directive "stub_status",離線安裝模式默認沒有安裝Nginx沒有添加modules/ngx_http_stub_status_module.o模塊
    #location /nginx_status {
        #stub_status on;
        #access_log off;
	#deny 127.0.0.1;  #拒絕的ip
        #allow 172.18.5.54; #允許的ip
        #allow 127.0.0.1;
        #deny all;
    #}
  }
}

cd /usr/local/nginx/conf/

vi nginx.conf

ps -ef | grep nginx # 查看Nginx安裝目錄,master process後面的就是nginx的目錄
nginx的主配置文件結構(重點)
nginx的主配置文件/usr/local/nginx/conf/nginx.conf主要分分爲六個區域:
main(全局設置)、events(nginx工作模式)、http(http設置)、
sever(主機設置)、location(URL匹配)、upstream(負載均衡服務器設置)。

配置文件結構圖
在這裏插入圖片描述

我們這裏配置只是負載均衡多個tomcat,配置不同的tomcat地址
如果是在springcloud項目中我們nginx對應的應該是多個zuul網關

開啓輪詢算法,配置負載均衡地址
在這裏插入圖片描述
然後我們用tomcat發佈一個測試項目
在這裏插入圖片描述
在這裏插入圖片描述
然後訪問通過tomcat訪問項目
在這裏插入圖片描述
然後我們已經配置好了nginx,再來通過nginx來訪問tomcat,訪問成功!
在這裏插入圖片描述
end…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章