[開發環境] 安裝 Nginx 並設定對應不同網域的站台 (以 Ubuntu 22.04 為例)

使用 APT 進行安裝 Nginx

  1. 更新 Ubuntu 系統的 apt 版本。
    sudo apt update
    
  2. 查詢 nginx  官網提供可安裝的版本。
    apt-cache madison nginx

  3. 安裝指定的版本,系統應該會詢問是否進續安裝,請輸入 y,並按照指示進行後續的動作,預設安裝完畢後,服務應該就已經啟動了。
    sudo apt install nginx=1.18.0-6ubuntu14.4
    
  4. 確認 nginx 服務是否有在運行,若看到底下的畫面代表已啟動成功。
    systemctl status nginx
    


設置防火牆(Configure Firewall)

目前沒有開防火牆,由路由器來卡控,有時間再來補實際的設定了。


安裝 Server Header 模組 (非必要)

  1. 因為標準版本無法移除 Server Header 若有需要可自行安裝外掛模組。
    $ sudo apt install build-essential libpcre3-dev zlib1g-dev
    
  2. 下載與已安裝的 nginx 相同版本的 Source Code ,並且壓縮。
    $ nginx -v # 1.18.0 
    $ wget http://nginx.org/download/nginx-1.18.0.tar.
    $ tar zxvf nginx-1.18.0.tar.gz
    $ rm nginx-1.18.0.tar.gz
    
  3. 下載 headers-more-nginx-module 原始碼。
    $ sudo git clone https://github.com/openresty/headers-more-nginx-module
    
  4. 設置和建置 Nginx 動態模組,成功建置後會產生一個 ngx_http_modsecurity_module.so 檔案到 ~/nginx-1.18.0/objs 目錄底下。
    $ cd ~/nginx-1.18.0
    $ ./configure --add-dynamic-module=../headers-more-nginx-module --with-compat
    $ make modules

  5. 完成建置後,將模組移至 nginx 目錄底下。
    $ sudo mkdir -p /etc/nginx/modules
    $ sudo cp objs/ngx_http_headers_more_filter_module.so /etc/nginx/modules
    # $ sudo cp objs/ngx_http_headers_more_filter_module.so /home/lawrence/NginxConfig/modules
    
  6. 將模組路徑設定到/etc/nginx/nginx.conf,但請小心放置的位置很重要,一定要在 event 上面,否則會收到 nginx: [emerg] "load_module" directive is specified too late in /etc/nginx/nginx.conf,的錯誤訊息。
    include /etc/nginx/modules-enabled/*.conf;
    
    # Lawrence,載入外部模組
    # ModSecurity
    # load_module /home/lawrence/NginxConfig/modules/ngx_http_headers_more_filter_module.so; 
    load_module /etc/nginx/modules/ngx_http_headers_more_filter_module.so; 
     
    events {
    ...
    }
    
  7. 完成安裝後,就可以設定移除標題等相關設定了。
    # 禁用 server 標頭
    more_clear_headers "server"; 
    # 自訂 server 標頭
    more_set_headers "server: lawrence";
    


Nginx 常用指令

nginx -v # 查看安裝的版本號碼 ex. nginx version: nginx/1.18.0 (Ubuntu)
sudo systemctl start nginx # 啟動服務
sudo systemctl stop nginx # 停止服務
sudo systemctl restart nginx # 重新啟動服務

sudo nginx -t # 檢查測試設定檔是否正確 /etc/nginx/nginx.conf
sudo systemctl reload nginx # 重新載入設定檔

sudo systemctl enable nginx # 開機自動啟動
sudo systemctl disable nginx # 關閉自動啟動



自定義設定檔

  1. 多站台設定,為了不要影響原本預設的參數設定,我把各站台的設定檔放在/home/lawrence/NginxConfig/cus_site_dev01.conf;,但實際上人別人應該不會放在這裡的路徑,視個人需求自行調整即可。
    server {
        listen 80; 
        server_name localhost.domain.com;
    
        location / {
            # 反向代理到另外一台主機的 1234 Port
            proxy_pass http://192.168.0.2:1234/;
    
            # 把 IP、Protocol 等 header 都一起送給反向代理的 server
            include /home/lawrence/NginxConfig/cus_proxy_headers.conf; 
        } 
    }
    
    server {
        listen 80;
        server_name localhost2.domain.com;
        server_name localhost3.domain.com;
    
        location / {
            # 反向代理到另外一台主機的 5678 Port
            proxy_pass http://192.168.0.3:5678;
    
            # 把 IP、Protocol 等 header 都一起送給反向代理的 server
            include /home/lawrence/NginxConfig/cus_proxy_headers.conf; 
        } 
    }
    
  2. Proxy 共用設定,/home/lawrence/NginxConfig/cus_proxy_headers.conf。
    # 多個網域都共用測設定用
    # 把 IP、Protocol 等 header 都一起送給反向代理的 server
    proxy_set_header Host $host;
    proxy_set_header Referer $http_referer;
    proxy_set_header X-Real-IP $remote_addr; # ARR 原本無此欄位
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Original-URL $request_uri;
    proxy_set_header X-Forwarded-By "PrimeEagleServer2";
    # proxy_set_header X-ARR-SSL $ssl_protocol/$ssl_cipher; # 這個不確定要不要
    # proxy_set_header X-ARR-LOG-ID $request_id; #
    
    proxy_redirect off;
    
  3. 將設定檔設定到 nginx.conf ,記得重新載入前先驗證設定檔是否正確。


nginx.conf 設定

預設設定檔路徑 /etc/nginx/nginx.conf。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##
	
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}


參考網站

留言