shell 腳本之一鍵部署安裝 Nginx

来源:https://www.cnblogs.com/edisonfish/archive/2023/04/01/17278111.html
-Advertisement-
Play Games

今天鹹魚給大家分享個源碼編譯安裝 Nginx 的 shell 腳本 這個 shell 腳本可重覆執行 完整源碼放在最後 定義一個變數來存放 nginx 版本號 version=1.15.4 nginx 下載地址:http://nginx.org/download/ 下列函數功能則是判斷當前步驟是否執 ...


今天鹹魚給大家分享個源碼編譯安裝 Nginx 的 shell 腳本

 

這個 shell 腳本可重覆執行

 

完整源碼放在最後

 

  • 定義一個變數來存放 nginx 版本號

version=1.15.4

 

nginx 下載地址:http://nginx.org/download/

 

  • 下列函數功能則是判斷當前步驟是否執行成功,並將結果輸出出來

 

  • 創建 nginx 用戶和用戶組

建議用大於 1000 的 GID 和 UID 號,表示普通用戶

這段代碼里我做了一個條件判斷:

如果在 /etc/passwd/etc/group 文件中過濾出 nginx,表示已經創建了 nginx 用戶和 nginx 用戶組,就不再創建了

 

  • 安裝一些擴展包

 

 

 

 

  • 下載 Nginx 並解壓縮

 

 

  • 編譯安裝 Nginx

這裡也做了一個條件判斷:

如果 /usr/local/nginx 目錄存在,則說明 nginx 已經成功安裝好了

 

  • 建立軟連接

這一步看個人習慣可做可不做

 

  • 註冊服務

將 nginx 註冊成服務之後就可以使用 systemctl 控制它了

 

  • 內核參數優化

 

  • 啟動 nginx 並設置開機自啟動

 

  • 負責配置寫入的函數

在上面的內核參數優化函數裡面,我並沒有使用 echo 將配置直接重定向到 /etc/sysctl.conf 文件裡面

而是用了 add_config_tofile 函數,第一個參數是配置項,第二個參數是文件名

 

  • main 函數

 

  • 完整代碼

執行結果如下:

 

 

#! /bin/bash

version=1.15.4

#判斷函數是否執行成功
function show_result(){
  if [ "$1" -eq 0 ]
    then
      echo -e "\e[32m$2 is Success .   [ OK ] \e[0m"
    else
      echo -e "\e[31m$2 is Fail .   [ FAIL ] \e[0m"
  fi
}

#創建 nginx 用戶和用戶組
function user_create(){
        local item="Create User and Group"
        if [ `cat /etc/{passwd,group} | grep nginx | wc -l ` -ge 2  ];
        then
                echo -e "\e[31mUser and Group exist! \e[0m"
    else
        groupadd -g 1004 nginx && \
        useradd -u 1004 -g 1004 -M  -s /sbin/nologin nginx    
        show_result $? "${item}"
    fi
}

#下載一些拓展包
function nginx_pkg(){
        local item="Packages Install"
        yum -y install gcc openssl-devel pcre-devel zlib-devel > /dev/null 2>&1 
        show_result $? "${item}"
}


#下載nginx
function nginx_download(){
        local item="Nginx Download"
        cd /usr/local/src && \
        wget http://nginx.org/download/nginx-${version}.tar.gz > /dev/null 2>&1 
        test -e /usr/local/src/nginx-${version} || tar zxf nginx-${version}.tar.gz 
        rm -rf /usr/local/src/nginx-${version}.tar.gz
        show_result $? "${item}"
}


#編譯安裝
function nginx_compile(){
        local item="Nginx Compile"
        cd /usr/local/src/nginx-${version}
        if [ `ls -l  /usr/local/ | grep 'nginx' | wc -l` -ge 1  ];
        then
                echo -e "\e[31mNginx exist! \e[0m"
        else
                ./configure --prefix=/usr/local/nginx > /dev/null 2>&1 && make > /dev/null 2>&1 && make install > /dev/null 2>&1 
        fi
        show_result $? "${item}"
}

#軟連接建立
function nginx_softlink(){
        local item="Nginx Softlink"
        test -d /etc/nginx/ || ln -s /usr/local/nginx/conf/ /etc/nginx
        test -e /usr/sbin/nginx || ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
        show_result $? "${item}"
}


#註冊服務
function nginx_service(){
        local item="Nginx Service"
        test -e /usr/lib/systemd/system/nginx.service || \ 
        echo '
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621ExecStartPre=/usr/bin/rm-f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
        ' > /usr/lib/systemd/system/nginx.service
        systemctl daemon-reload 
        show_result $? "${item}"
}


#內核優化
function nginx_kernel(){
        local item="Optimize Kernel Arguments"
        cp /etc/sysctl.conf /etc/sysctl.conf.${current_time} > /dev/null 2>&1
        arch_ratio=$([[ ! -z $(uname -a | grep x86_64) ]] && expr 64 / 32 || expr 32 / 32)
        memory_size=$(free -b| awk 'NR==2{print $2}')
        nf_conntrack_size=$(expr ${memory_size} / 16384 / ${arch_ratio})
        #開啟反向路徑過濾
        add_config_tofile "net.ipv4.conf.default.rp_filter = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.all.rp_filter = 1" /etc/sysctl.conf
        #處理無源路由包
        add_config_tofile "net.ipv4.conf.all.accept_source_route = 0" /etc/sysctl.conf
        add_config_tofile "net.ipv4.conf.default.accept_source_route = 0" /etc/sysctl.conf
        #core文件名中添加pid作為擴展名
        add_config_tofile "kernel.core_uses_pid = 1" /etc/sysctl.conf
        #開啟syn洪水攻擊保護
        add_config_tofile "net.ipv4.tcp_syncookies = 1" /etc/sysctl.conf
        #修改消息隊列長度
        add_config_tofile "kernel.msgmnb = 65536" /etc/sysctl.conf
        add_config_tofile "kernel.msgmax = 65536" /etc/sysctl.conf
        #修改最大記憶體共用段大小bytes
        add_config_tofile "kernel.shmmax = 68719476736" /etc/sysctl.conf
        add_config_tofile "kernel.shmall = 4294967296" /etc/sysctl.conf
        #timewait數量預設18000
        add_config_tofile "net.ipv4.tcp_max_tw_buckets = 600" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_sack = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_window_scaling = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_rmem = 4096 87380 16777216" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_wmem = 4096 65536 16777216" /etc/sysctl.conf
        add_config_tofile "net.core.rmem_default = 8388608" /etc/sysctl.conf
        add_config_tofile "net.core.wmem_max = 16777216" /etc/sysctl.conf
        #未收到客戶端確認信息連接請求的最大值
        add_config_tofile "net.ipv4.tcp_max_syn_backlog = 262144" /etc/sysctl.conf
        #放棄建立連接之前發送的synack包
        add_config_tofile "net.ipv4.tcp_syn_retries = 2" /etc/sysctl.conf
        #開啟重用,允許time—wait socket 重新用語新的tcp連接
        add_config_tofile "net.ipv4.tcp_tw_reuse = 1" /etc/sysctl.conf
        add_config_tofile "net.ipv4.tcp_fin_timeout = 1" /etc/sysctl.conf
        #防止簡單的ddos攻擊
        add_config_tofile "net.ipv4.tcp_max_orphans = 3276800" /etc/sysctl.conf
        #啟用timewait快速收回
        add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
        #keeptime啟用時tcp發送keepalive消息的頻度,預設2h
        add_config_tofile "net.ipv4.tcp_keepalive_time = 600" /etc/sysctl.conf
        #允許系統打開的埠範圍
        add_config_tofile "net.ipv4.ip_local_port_range = 1024 65535" /etc/sysctl.conf
    #資源回收
    add_config_tofile "net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf
    #路由轉發
    add_config_tofile "net.ipv4.ip_forward = 1" /etc/sysctl.conf 
        #修改防火牆連接跟蹤表大小,預設65535
        add_config_tofile "net.netfilter.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        add_config_tofile "net.nf_conntrack_max = ${nf_conntrack_size}" /etc/sysctl.conf
        #解禁ping
        add_config_tofile "net.ipv4.icmp_echo_ignore_all = 0" /etc/sysctl.conf
        modprobe bridge
        sysctl -p > /dev/null 2>&1
        show_result $? "${item}"
}



#啟動 nginx
function nginx_start(){
        local item="Nginx start"
        systemctl enable nginx --now > /dev/null 2>&1
        show_result $? "${item}"
}


#負責寫入配置的函數
function add_config_tofile(){
        local keywords=`echo $1| awk -F "[= ]+" '{print $1}'`
        local SearchResult=`grep "^${keywords}" "$2"`
        if [ -z "${SearchResult}" ]
                then
                echo $1 >> $2
        else
                sed -i "s/^${keywords}.*/$1/" $2
        fi
}
#主函數
function main(){
        user_create
        nginx_pkg
        nginx_download
        nginx_compile
        nginx_softlink
        nginx_service
        nginx_kernel
        nginx_start
}

main

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 數字常量 int: 一般的整數, long: 長整型,2.x版本需在數字後加 “L” 或 “l” ,表示長整型 如 100000000L; python3.x 版本後不分長整型,統一為int,不可加 “L” 或 “l” float: 浮點數,1.0 也為浮點數,float 可強制轉換為 int,取整 ...
  • 使用方法 安裝 Maven <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifactId> <version>1.2.4</version> </dependency> G ...
  • 前置要求:有百度賬號,實名認證以及開發者認證,創建應用並獲取到關鍵憑證:Appid、Appkey、Secretkeyk和Signkey 平臺上入門十分清楚,直接對著逐步操作即可,個人開發者審核也很快 百度網盤開放平臺地址如下:https://pan.baidu.com/union/doc/nksg0 ...
  • 往一張產品圖片上,加兩個小標簽,Demo實現最好的效果 素材例圖與最終效果如下: 具體實現的代碼如下: 添加引用: using System.Drawing; using System.Drawing.Drawing2D; 註意:如果添加命名空間沒效果,加一下Nuget包 System.Drawin ...
  • 1.1 關於C# C#只是一種簡單安全的新型面向對象語言,繼承了C的語法風格和C++的面向對象特性,不再提供對指針類型的支持(因此程式不可隨便訪問記憶體地址空間)、不再支持多重繼承; C#的誕生意義是生成面向.NET Framework環境的代碼,身為編程語言的一種,它作為開發工具而存在,本身並不是. ...
  • 1. 編寫函數,實現列印綠色OK和紅色FAILED 判斷是否有參數,存在為Ok,不存在為FAILED [root@template shellScript]# cat ex1.sh # 編寫函數,實現列印綠色OK和紅色FAILED 判斷是否有參數,存在為Ok,不存在為FAILED #!/bin/ba ...
  • 一、常規操作 1、創建文件夾 mkdir 文件夾名稱 2、創建文件或編輯文件 在目標文件夾中執行 vi 文件名.尾碼 # i (進入可編輯模式) # ESC (按Esc按鍵,退出編輯模式) # :q (未作任何編輯,直接退出) # :q! (強制退出) # :wq (保存退出) 3、文件夾或文件賦權 ...
  • 前言 最近電腦重新安裝nmap,但是圖形化界面無法運行,如圖所示: 是因為用戶名稱中存在中文字元。 接下來就親自實操一下如何將Windows操作系統用戶名的中文名稱修改為英文名稱。 一、控制面板修改電腦名 (1):桌面左下角搜索框搜索控制面板(2):打開控制面板,點擊用戶帳戶下的更改賬戶類型 (3) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...