初探Nginx(一)

前言

老實說,從Android開發轉到後端開發,有些基礎概念仍是比較模糊的,特別是對一些框架的熟悉。其中,Nginx算一個,因而忽然有了想搞懂Nginx的衝動。。。php

Nginx是什麼?

  • 按照慣例,來波官方定義。

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 26.34% busiest sites in June 2019. Here are some of the success stories: Dropbox, Netflix, Wordpress.com, FastMail.FM.html

  • 釋義:Nginx是一個HTTP服務器、反向代理服務器、郵件代理服務器、TCP/UDP代理服務器。java

  • 說到這裏,就會有個疑問,和咱們一般使用的Tomcat有何區別?nginx

TomcatNginx的應用場景不一樣。Nginx是開源、高性能的HTTP服務器,而Tomcat更可能是一種容器,做爲Web服務器處理Java Servlet、JSP等。正則表達式

nginx安裝

## 安裝指令
 brew install nginx
 ## 安裝目錄
 cd /usr/local/etc/nginx
複製代碼

nginx.conf

Nginx很重要的一環就是配置文件,學習配置文件的格式以及如何使用每一個配置是基礎。apache

全局配置參數

#user nobody;
worker_processes  1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
    # we’re on a Solaris-based system and have determined that nginx
	# will stop responding to new requests over time with the default
	# connection-processing mechanism, so we switch to the second-best
	use /dev/poll;
	# the product of this number and the number of worker_processes
	# indicates how many simultaneous connections per IP:port pair are accepted
	worker_connections 2048;
}
複製代碼
  • user:使用這個參數來配置worker進程的用戶和組。若是忽略group,那麼group的名字等於該參數指定用戶的用戶組。
  • worker_processes:指定worker進程啓動的數量。這些進程用於處理客戶的全部鏈接。選擇 一個正確的數量取決於服務器環境、磁盤子系統和網絡基礎設施。 一個好的經驗法則是設置該參數的值與CPU綁定的負載處理器核心的數量相同,並用 1.5~2之間的數乘以這個數做爲I/O密集型負載。
  • error_log:是全部錯誤寫入的文件。若是在其餘區段中沒有設置其餘的error_log,那麼這個日誌文件將會記錄全部的錯誤。該指令的第二個參數指定了被記錄錯誤的級別( debug、 info、 notice、 warn、 error、 crit、 alert、emerg)。注意,debug級別的錯誤只有在編譯時配置了--with-debug 選項纔可使用。
  • pid:設置記錄主進程ID的文件,這個配置將會覆蓋編譯時的默認配置。
  • use:該指令用於指示使用什麼樣的鏈接方法。這個配置將會覆蓋編譯時的默認配置,若是配置該指令,那麼須要一個events 區段。 一般不須要覆蓋,除非是當編譯時的默認值隨着時間的推移產生錯誤時才須要被覆蓋設置。
  • worker_connections:該指令配置一個工做進程可以接受併發鏈接的最大數。這個鏈接包括客戶鏈接和向上遊服務器的鏈接,但並不限於此。這對於反向代理服務器尤其重要,爲了達到這個併發性鏈接數量,須要在操做系統層面進行一些額外調整。

HTTP server部分

http {
	## include文件
    include       mime.types;
    
    default_type  application/octet-stream;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    # '$status $body_bytes_sent "$http_referer" '
    # '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log logs/access.log main;

	## 文件I/O指令,該指令使用sendfile(2)直接複製數據從一個到另外一個文件描述符
    sendfile        on;
    ## 僅依賴於sendfile使用,Nginx在一個數據包中嘗試發送響應頭以及在數據包中發送一個完整的文件
    #tcp_nopush on;

	## 該指令指定keep-alive鏈接持續多久。
    #keepalive_timeout 0;
    keepalive_timeout  65;

	## 開啓gzip壓縮
    #gzip on;
}
複製代碼

虛擬服務器部分

  • 描述的是一組根據不一樣的server_name指令邏輯分割的資源。
server {
		
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log logs/host.access.log main;

		## location 指令能夠用在虛擬服務器 server 部分,井且意味着提供來自客戶端的 URI 或 者內部重定向訪問。
        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        # proxy_pass http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        # root html;
        # fastcgi_pass 127.0.0.1:9000;
        # fastcgi_index index.php;
        # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        # include fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        # deny all;
        #}
    }
複製代碼
  • 對於一個特定的請求,肯定哪些虛擬服務器提供該請求的服務時,Nginx應該遵循下面的邏輯。
  1. 匹配 IP 地址和 listen 指令指定的端口。
  2. 將 Host頭字段做爲一個字符串匹配 server_name指令。
  3. 將 Host 頭字段與 server_name 指令值字符串的開始部分作匹配 。
  4. 將 Host 頭字段與 server_name 指令值字符串的結尾部分作匹配 。
  5. 將 Host 頭字段與 sever_name 指令值進行正則表達式匹配 。
  6. 若是全部 Host 頭匹配失敗,那麼將會轉向 listen 指令標記的 default_server。
  7. 若是全部的 Host頭匹配失敗,而且沒有 default_sever,那麼將會轉向第一個 server 的 listen指令,以知足第1步。

結語

能夠看出,Nginx的配置是模塊化的,全局配置負責各個方面,HTTP Server、虛擬服務器則分模塊配置,每一個server_name單獨生效。後端

參考文獻

一、www.nginx.cn/doc/general… 二、精通Nginx(第二版) 三、examples.javacodegeeks.com/enterprise-…tomcat

相關文章
相關標籤/搜索