全棧開發實戰——Nginx

介紹

Nginx是一個開放源代碼的高性能HTTP和反向代理服務器,爲Internet上一些最大的站點提供支持。

Nginx可以用作獨立的Web服務器,也可以用作 Apache 和其他Web服務器的反向代理。

與Apache相比,Nginx可以處理大量併發連接,並且每個連接的內存佔用量較小。

安裝

首先更新apt軟件包列表:

sudo apt update

安裝Nginx:

sudo apt install nginx

Nginx服務將在安裝過程完成後自動啓動。您可以通過運行以下 curl 命令進行驗證:

curl -I 127.0.0.1

使用systemctl管理Nginx服務

您可以使用systemctl命令來管理Nginx服務,與其他任何systemd單元相同。這裏我們只列舉我們常用的命令。

要停止Nginx服務,請運行:

sudo systemctl stop nginx

要啓動,請鍵入:

sudo systemctl start nginx

重新啓動Nginx服務:

sudo systemctl restart nginx

進行一些配置更改後,重新加載Nginx服務:

sudo systemctl reload nginx

Nginx配置文件的結構和最佳做法

  • Nginx配置文件存儲在/etc/nginx目錄中。
  • 主要Nginx配置文件爲/etc/nginx/nginx.conf
  • 服務器塊(vhost)配置文件存儲在/etc/nginx/sites-available目錄。除非將這些文件鏈接到/etc/nginx/sites-enabled目錄,否則Nginx不會使用該目錄中的配置文件。
  • 通過從服務器目錄創建 symlink (指針)來激活服務器塊。配置文件站點從sites-available目錄移至sites-enabled目錄,例:ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/www.example.com
  • 要編寫更具可維護性的代碼,遵循標準命名約定是一個好主意。例如,如果您的域名是www.example.com,則配置文件應命名爲/etc/nginx/sites-available/www.example.com.conf
  • /etc/nginx/snippets錄包含可包含在服務器阻止文件中的配置摘要。如果使用可重複的配置段,則可以將這些段重構爲片段,並將片段文件包括到服務器塊中。
  • Nginx日誌文件(access.logerror.log)位於var/log/nginx/錄中。建議每個服務器塊使用不同的accesserror日誌文件。
  • 您可以將域文檔根目錄設置爲所需的任何位置。 Webroot的最常見位置包括:
    • /home/<user_name>/<site_name>
    • /var/www/<site_name>
    • /var/www/html/<site_name>
    • /opt/<site_name>

https 實例配置

mozilla開源了一個非常好用的工具: https://ssl-config.mozilla.org ,點一點就可以自動生成推薦的SSL配置。 有個不錯的網站可以用來檢測服務器證書配置情況,https://www.ssllabs.com/ssltest/analyze.html

  1. 生成 dhparam.pem 文件, 在命令行執行方法:
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
  1. 在/etc/nginx/ssl 目錄中新建爲名www.example.com 的目錄,並放入ssl證書,例如從阿里雲下載的證書。
  2. 在/etc/nginx/sites-available目錄中新建名爲 www.example.com 的文件,並輸入以下內容:
server {
  # 根目錄已經有個default了
  # listen 80 default_server;
  # listen [::]:80 default_server;
  listen 80;
  listen [::]:80;
  server_name www.example.com;
  # 重定向所有HTTP網站訪問以使用HTTPS
  return 301 https://$host$request_uri;
}

server {
  # 指定ssl監聽端口
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  # 證書綁定的域名,例如:www.example.com、localhost
  server_name www.example.com;
  # 指定服務器證書路徑
  ssl_certificate /etc/nginx/ssl/www.example.com/1234567_www.example.com.pem;
  # 指定私鑰證書路徑
  ssl_certificate_key /etc/nginx/ssl/www.example.com/1234567_www.example.com.key;
  # 配置會話緩存爲10m,大約40000個session
  ssl_session_cache shared:SSL:10m;
  # 配置會話緩存超時時間爲1天
  ssl_session_timeout 1d;
  # 禁用會話重用
  ssl_session_tickets off;

  # DHE密碼器的Diffie-Hellman參數, 推薦 2048 位
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;

  # 指定SSL服務器端支持的協議版本
  # ssl_protocols TLSv1.2 TLSv1.3;
  ssl_protocols TLSv1.2;
  # 指定加密算法
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  # 在使用SSLv3和TLS協議時指定服務器的加密算法要優先於客戶端的加密算法
  ssl_prefer_server_ciphers on;

  # 使用嚴格傳輸策略HSTS。當瀏覽器從HTTPS網站看到此標頭時,它“獲悉”只能使用HTTPS(SSL或TLS)訪問該域。它會在max-age一段時間內(通常爲31,536,000秒,大約等於1年)緩存此信息
  # includeSubDomains參數告訴瀏覽器HSTS策略也適用於當前域的所有子域,always參數確保爲所有響應(包括內部生成的錯誤響應)設置標頭
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

  # 啓用ssl OCSP stapling功能, 服務端主動查詢OCSP結果, 提高TLS握手效率
  ssl_stapling on;
  # 開啓OCSP stapling 驗證
  ssl_stapling_verify on;
  # 使用根CA和中級證書驗證OCSP響應的信任鏈
  ssl_trusted_certificate /etc/nginx/ssl/www.example.com/1234567_www.example.com.pem;

  # replace with the IP address of your resolver
  # resolver 127.0.0.1;
  # 匹配請求
  location / {
    # 設置客戶端真實的域名(包括端口號)
    proxy_set_header Host $host;
    # 設置客戶端或上一級代理IP
    proxy_set_header X-Real-IP $remote_addr;
    # 設置客戶端或上一級端口
    proxy_set_header X-Real-Port $remote_port;
    # 設置在多層代理時會包含真實客戶端及中間每個代理服務器的IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 設置客戶端真實的協議(http還是https)
    proxy_set_header X-Forwarded-Proto $scheme;
    # 設置代理服務訪問地址
    proxy_pass http://127.0.0.1:7060;
    # 靜態資源代理
    # root /var/www/www.example.com;
    # try_files $uri $uri/ /index.html;
    # index index.html index.htm;
  }
}
  1. 激活
ln -s /etc/nginx/sites-available/www.example.com.conf /etc/nginx/sites-enabled/www.example.com.conf
  1. 使用systemctl restart nginx 重新啓動nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章