nginx實戰

nginx模塊介紹

main
events   {
  ....
}
http        {
  ....
  upstream myproject {
    .....
  }
  server  {
    ....
    location {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}

nginx配置文件主要分爲六個區域: main(全局設置)、events(nginx工做模式)、http(http設置)、 sever(主機設置)、location(URL匹配)、upstream(負載均衡服務器設置)php

  1. main模塊
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進程的最大打開文件數限制。若是沒設置的話,這個值爲操做系統的限制。跨域

  1. events 模塊
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啓動和關閉

  • /usr/local/nginx/nginx # 啓動
  • /usr/local/nginx/nginx -s stop # 啓動
  • /usr/local/nginx/nginx -s reload #平滑重啓
  • /usr/local/nginx/nginx.conf #配置文件
  • ./nginx -t檢測配置文件是否正確

基於域名的虛擬主機

假設咱們在本地開發有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 / { 
     
    }
}

參考資料一

參考資料二

相關文章
相關標籤/搜索