標籤:

Nginx基本配置備忘

Nginx基本配置備忘從屬於筆者的服務端應用程序入門與實踐,更多知識體系參閱2016:我的技術體系結構圖:Web/ServerSideApplication/MachineLearning。

Nginx 配置

在了解具體的Nginx配置項之前我們需要對於Nginx配置文件的構成有所概念,一般來說,Nginx配置文件會由如下幾個部分構成:

# 全局塊n... n# events塊nevents { n ...n}n# http塊nhttp n{n # http全局塊n ... n # 虛擬主機server塊n server n { n # server全局塊n ... n # location塊n location [PATTERN] n {n ...n }n location [PATTERN] n {n ...n }n }n servern {n ...n }n # http全局塊n ... n}n

在上述配置中我們可以看出,Nginx配置文件由以下幾個部分構成:

  • 全局塊:配置影響nginx全局的指令。一般有運行nginx伺服器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。

  • events塊:配置影響nginx伺服器或與用戶的網路連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等。

  • http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。

  • server塊:配置虛擬主機的相關參數,一個http中可以有多個server。

  • location塊:配置請求的路由,以及各種頁面的處理情況。

########### 每個指令必須有分號結束。#################n#user administrator administrators; #配置用戶或者組,默認為nobody nobody。n#worker_processes 2; #允許生成的進程數,默認為1n#pid /nginx/pid/nginx.pid; #指定nginx進程運行文件存放地址nerror_log log/error.log debug; #制定日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emergnevents {n accept_mutex on; #設置網路連接序列化,防止驚群現象發生,默認為onn multi_accept on; #設置一個進程是否同時接受多個網路連接,默認為offn #use epoll; #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportn worker_connections 1024; #最大連接數,默認為512n}nhttp {n include mime.types; #文件擴展名與文件類型映射表n default_type application/octet-stream; #默認文件類型,默認為text/plainn #access_log off; #取消服務日誌 n log_format myFormat $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; #自定義格式n access_log log/access.log myFormat; #combined為日誌格式的默認值n sendfile on; #允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。n sendfile_max_chunk 100k; #每個進程每次調用傳輸數量不能大於設定的值,默認為0,即不設上限。n keepalive_timeout 65; #連接超時時間,默認為75s,可以在http,server,location塊。nn # 定義常量n upstream mysvr { n server 127.0.0.1:7878;n server 192.168.10.121:3333 backup; #熱備n }n error_page 404 https://www.baidu.com; #錯誤頁 n n #定義某個負載均衡伺服器 n server {n keepalive_requests 120; #單連接請求上限次數。n listen 4545; #監聽埠n server_name 127.0.0.1; #監聽地址 n location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。n #root path; #根目錄n #index vv.txt; #設置默認頁n proxy_pass http://mysvr; #請求轉向mysvr 定義的伺服器列表n deny 127.0.0.1; #拒絕的ipn allow 172.18.5.54; #允許的ip n } n }n} n

虛擬主機與靜態站點

  • SERVING STATIC CONTENT

本部分概述如何配置Nginx進行靜態內容服務,Nginx的靜態內容分發能力還是非常強大的。

http {n server {n listen 80;n server_name www.domain1.com;n access_log logs/domain1.access.log main;n location / {n index index.html;n root /var/www/domain1.com/htdocs;n }n }n server {n listen 80;n server_name www.domain2.com;n access_log logs/domain2.access.log main;n location / {n index index.html;n root /var/www/domain2.com/htdocs;n }n }n}n

虛擬主機配置詳解

主機與埠

listen 127.0.0.1:8000;nlisten *:8000;nlisten localhost:8000;n# IPV6nlisten [::]:8000;n# other paramsnlisten 443 default_server ssl;nlisten 127.0.0.1 default_server accept_filter=dataready backlog=1024n

服務域名

# 支持多域名配置nserver_name www.barretlee.com barretlee.com;n# 支持泛域名解析nserver_name *.barretlee.com;n# 支持對於域名的正則匹配nserver_name ~^.barret.com$;n

URI匹配

location = / {n # 完全匹配 =n # 大小寫敏感 ~n # 忽略大小寫 ~*n}nlocation ^~ /images/ {n # 前半部分匹配 ^~n # 可以使用正則,如:n # location ~* .(gif|jpg|png)$ { }n}nlocation / {n # 如果以上都未匹配,會進入這裡n}n

文件路徑配置

根目錄

location / {n root /home/barret/test/;n}n

別名

location /blog {n alias /home/barret/www/blog/;n}nlocation ~ ^/blog/(d+)/([w-]+)$ {n # /blog/20141202/article-name n # -> /blog/20141202-article-name.mdn alias /home/barret/www/blog/$1-$2.md;n}n

首頁

index /html/index.html /php/index.php;n

重定向頁面

error_page 404 /404.html;nerror_page 502 503 /50x.html;nerror_page 404 =200 /1x1.gif;nlocation / {n error_page 404 @fallback;n}nlocation @fallback {n # 將請求反向代理到上游伺服器處理n proxy_pass http://localhost:9000;n}n

try_files

try_files $uri $uri.html $uri/index.html @other;nlocation @other {n # 嘗試尋找匹配 uri 的文件,失敗了就會轉到上游處理n proxy_pass http://localhost:9000;n}nlocation / {n # 嘗試尋找匹配 uri 的文件,沒找到直接返回 502n try_files $uri $uri.html =502;n}n

緩存配置

  • HTTP 緩存的四種風味與緩存策略

Expire:過期時間

在Nginx中可以配置緩存的過期時間:

location ~* .(?:ico|css|js|gif|jpe?g|png)$ {n expires 30d;n add_header Vary Accept-Encoding;n access_log off;n }n

我們也可以添加更複雜的配置項:

location ~* ^.+.(?:css|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|svg)$ {nn access_log off;n expires 30d;n ## No need to bleed constant updates. Send the all shebang in onen ## fell swoop.n tcp_nodelay off;n ## Set the OS file cache.n open_file_cache max=3000 inactive=120s;n open_file_cache_valid 45s;n open_file_cache_min_uses 2;n open_file_cache_errors off;n }n

反向代理

events{nn}nhttp{n upstream ggzy {n server 127.0.0.1:1398 weight=3;n server 127.0.0.1:1399;n }n # 80埠配置,可配置多個Virtual Hostn server {n listen 80;n index index index.htm index.py index.html;nn server_name app.truelore.cn;nn location / {n proxy_pass_header Server;n proxy_set_header Host $http_host;n proxy_set_header X-Real-IP $remote_addr;n proxy_set_header X-Scheme $scheme;n proxy_pass http//ggzy;n }n }n}n

NodeJS Application

const http = require(http);nhttp.createServer((req, res) => {n res.end(hello world);n}).listen(9000);n

任何請求過來都返回 hello world,簡版的 Nginx 配置如下,

events {n # 這裡可不寫東西n use epoll;n}nhttp {n server {n listen 127.0.0.1:8888;n # 如果請求路徑跟文件路徑按照如下方式匹配找到了,直接返回n try_files $uri $uri/index.html;n location ~* ^/(js|css|image|font)/$ {n # 靜態資源都在 static 文件夾下n root /home/barret/www/static/;n }n location /app {n # Node.js 在 9000 開了一個監聽埠n proxy_pass http://127.0.0.1:9000;n }n # 上面處理出錯或者未找到的,返回對應狀態碼文件n error_page 404 /404.html;n error_page 502 503 504 /50x.html;n }n}n

首先 try_files,嘗試直接匹配文件;沒找到就匹配靜態資源;還沒找到就交給 Node 處理;否則就返回 4xx/5xx 的狀態碼。

Upstream Cache

  • A Guide to Caching with NGINX and NGINX Plus

http {n ,,,,,n proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=10g;n server {n ........n location ~* ^.+.(js|ico|gif|jpg|jpeg|png|html|htm)$ {n log_not_found off;n access_log off;n expires 7d;n proxy_pass http://img.example.com ;n proxy_cache imgcache;n proxy_cache_valid 200 302 1d;n proxy_cache_valid 404 10m;n proxy_cache_valid any 1h;n proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;n }n }n}n

HTTPS

  • HTTPS 理論詳解與實踐

Lets Encrypt 證書申請

Lets Encrypt 為我們提供了非常方便的命令行工具certbot,筆者是在Ubuntu 16.04的機器上進行配置,因此只要執行如下命令即可:

# 安裝letsencrypt命令行nn$ sudo apt-get install letsencrypt n# 獨立的為example.com與www.example.com申請證書n$ letsencrypt certonly --standalone -d example.com -d www.example.comn# 自動執行證書刷新操作n$ letsencrypt renew --dry-run --agree-tosn

基本HTTPS配置

基本的HTTPS支持配置如下:

server { n listen 192.168.1.11:443; #ssl埠 n server_name test.com; n #為一個server{......}開啟ssl支持 n ssl on; n #指定PEM格式的證書文件 n ssl_certificate /etc/nginx/test.pem; n #指定PEM格式的私鑰文件 n ssl_certificate_key /etc/nginx/test.key; n} n

在真實的生產環境中,我們的配置如下:

server {n # 如果需要spdy也可以加上,lnmp1.2及其後版本都默認支持spdy,lnmp1.3 nginx 1.9.5以上版本默認支持http2n listen 443 ssl; n # 這裡是你的域名n server_name www.vpser.net; n index index.html index.htm index.php default.html default.htm default.php;n # 網站目錄n root /home/wwwroot/www.vpser.net; n # 前面生成的證書,改一下裡面的域名就行n ssl_certificate /etc/letsencrypt/live/www.vpser.net/fullchain.pem; n # 前面生成的密鑰,改一下裡面的域名就行n ssl_certificate_key /etc/letsencrypt/live/www.vpser.net/privkey.pem; n ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;n ssl_prefer_server_ciphers on;n ssl_session_cache shared:SSL:10m;nn #這個是偽靜態根據自己的需求改成其他或刪除n include wordpress.conf; n n #error_page 404 /404.html;n n location ~ [^/].php(/|$)n {n # comment try_files $uri =404; to enable pathinfon try_files $uri =404;n fastcgi_pass unix:/tmp/php-cgi.sock;n fastcgi_index index.php;n # lnmp 1.0及之前版本替換為include fcgi.conf;n include fastcgi.conf; n #include pathinfo.conf;n }nn location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$n {n expires 30d;n }nn location ~ .*.(js|css)?$n {n expires 12h;n }nn access_log off;n}n

強制HTTP轉到HTTPS

Nginx Rewrite

server { n listen 192.168.1.111:80; n server_name test.com; n rewrite ^(.*)$ https://$host$1 permanent; n} n

Nginx 497錯誤碼

利用error_page命令將497狀態碼的鏈接重定向到test.com這個域名上

server { n listen 192.168.1.11:443; #ssl埠 n listen 192.168.1.11:80; #用戶習慣用http訪問,加上80,後面通過497狀態碼讓它自動跳到443埠 n server_name test.com; n #為一個server{......}開啟ssl支持 n ssl on; n #指定PEM格式的證書文件 n ssl_certificate /etc/nginx/test.pem; n #指定PEM格式的私鑰文件 n ssl_certificate_key /etc/nginx/test.key; n n #讓http請求重定向到https請求 n error_page 497 https://$host$uri?$args; n} n

Meta刷新,前端跳轉

在HTTP正常返回的頁面中添加meta屬性:

<html> n<meta http-equiv="refresh" content="0;url=https://test.com/"> n</html> n

server { n listen 192.168.1.11:80; n server_name test.com; n n location / { n #index.html放在虛擬主機監聽的根目錄下 n root /srv/www/http.test.com/; n } n #將404的頁面重定向到https的首頁 n error_page 404 https://test.com/; n} n

反向HTTPS轉發到內部HTTP

延伸閱讀:

  • 知乎專欄:某熊的全棧之路
  • 知乎專欄:前端當自強
  • lotuc的編程之路
  • 2016-我的技術之路:編程知識體系結構
  • 2016-我的前端之路:工具化與工程化

推薦閱讀:

淺談前端線上部署與運維
nginx快速入門之基本原理篇
如何 windows下nginx+django+flup python3?
把nginx改為一個普通的tcp伺服器,應用層協議自己定義,有可行性嗎?
準確地配置 NginX (1)

TAG:Nginx |