main events { .... } http { .... upstream myproject { ..... } server { .... location { .... } } server { .... location { .... } } .... }
nginx配置文件主要分爲六個區域: main(全局設置)、events(nginx工做模式)、http(http設置)、 sever(主機設置)、location(URL匹配)、upstream(負載均衡服務器設置)php
user nobody nobody; worker_processes 2; error_log /usr/local/var/log/nginx/error.log notice; pid /usr/local/var/run/nginx/nginx.pid; worker_rlimit_nofile 1024;
user 來指定Nginx Worker進程運行用戶以及用戶組,默認由nobody帳號運行。html
worker_processes來指定了Nginx要開啓的子進程數。每一個Nginx進程平均耗費10M~12M內存。根據經驗,通常指定1個進程就足夠了,若是是多核CPU,建議指定和CPU的數量同樣的進程數便可。我這裏寫2,那麼就會開啓2個子進程,總共3個進程。前端
error_log用來定義全局錯誤日誌文件。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,nginx
debug輸出日誌最爲最詳細,而crit輸出日誌最少。web
pid用來指定進程id的存儲文件位置。api
worker_rlimit_nofile 更改worker進程的最大打開文件數限制。若是沒設置的話,這個值爲操做系統的限制。跨域
events { worker_connections 2048; multi_accept on; use epoll; }
worker_connections用於定義Nginx每一個進程的最大鏈接數,即接收前端的最大請求數,默認是1024。最大客戶端鏈接數由worker_processes和worker_connections決定,即Max_clients=worker_processes*worker_connections,在做爲反向代理時,Max_clients變爲:Max_clients = worker_processes * worker_connections/4。 進程的最大鏈接數受Linux系統進程的最大打開文件數限制,在執行操做系統命令「ulimit -n 65536」後worker_connections的設置才能生效。瀏覽器
worker_rlimit_nofile,咱們能夠將這個值設得很高。服務器
use用來指定Nginx的工做模式。Nginx支持的工做模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工做模式,kqueue和epoll是高效的工做模式,不一樣的是epoll用在Linux平臺上,而kqueue用在BSD系統中,由於Mac基於BSD,因此Mac也得用這個模式,對於Linux系統,epoll工做模式是首選。負載均衡
multi_accept 告訴nginx收到一個新鏈接通知後接受盡量多的鏈接。
nginx啓動和關閉
假設咱們在本地開發有3個項目,分別在hosts裏映射到本地的127.0.0.1上:
127.0.0.1 www.iyangyi.com iyangyi.com 127.0.0.1 api.iyangyi.com 127.0.0.1 admin.iyangyi.com
有這樣3個項目,分別對應於web根目錄下的3個文件夾,咱們用域名對應文件夾名字,這樣子好記:
/Users/yangyi/www/www.iyangyi.com/ /Users/yangyi/www/api.iyangyi.com/ /Users/yangyi/www/admin.iyangyi.com/
每一個目錄下都有一個index.php文件,都素簡單的輸入本身的域名。
面咱們就來搭建這3個域名的虛擬主機,很顯然,咱們要新建3個server來完成。爲了看起來簡潔好看,咱們使用require來包含外面的3個server在nginx.conf中,這樣就清晰了不少。不會使得這個nginx.conf內容太多:
main events { .... } http { .... include vhost/www.iyangyi.conf; include vhost/api.iyangyi.conf; include vhost/admin.iyangyi.conf; #或者用 *.conf 包含 # include vhost/*.conf }
既然每個conf都是一個server,前面已經學習了一個完整的server寫的了。下面就開始:
# www.iyangyi.conf server { listen 80; server_name www.iyangyi.com iyangyi.com; root /Users/yangyi/www/www.iyangyi.com/; index index.php index.html index.htm; access_log /usr/local/var/log/nginx/www.iyangyi.access.log main; error_log /usr/local/var/log/nginx/www.iyangyi.error.log error; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
# api.iyangyi.conf server { listen 80; server_name api.iyangyi.com; root /Users/yangyi/www/api.iyangyi.com/; index index.php index.html index.htm; access_log /usr/local/var/log/nginx/api.iyangyi.access.log main; error_log /usr/local/var/log/nginx/api.iyangyi.error.log error; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }
這樣3個很精簡的虛擬域名就搭建好了。重啓下nginx,而後打開瀏覽器訪問一下這3個域名,就能看到對應的域名內容了。
upstream webservers{ server 192.168.33.11 weight=10; server 192.168.33.12 weight=10; server 192.168.33.13 weight=10; } server { listen 80; server_name upstream.iyangyi.com; access_log /usr/local/var/log/nginx/upstream.iyangyi.access.log main; error_log /usr/local/var/log/nginx/upstream.iyangyi.error.log error; location / { proxy_pass http://webservers; proxy_set_header X-Real-IP $remote_addr; } }
在vhost目錄中新建一個conf server
server { listen 80; server_name leizhi.xiak.tech www.leizhi.xiak.tech; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:9000; client_max_body_size 10m; } }
重啓下nginx: sudo nginx -s reload 固然。proxy 還有其餘的參數,好比:proxy_set_header 用來設置header頭部信息參數轉發等,等用了能夠仔細看看。
server { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; location / { } }