ubuntu環境下nginx的編譯安裝以及相關設置

来源:http://www.cnblogs.com/learn21cn/archive/2017/09/28/7606728.html
-Advertisement-
Play Games

一、基本的編譯與安裝 1、安裝依賴項 2、下載新版本,到官網複製下載鏈接 3、解壓 4、編譯安裝 編譯選項說明: --prefix=path 如果在編譯的不指定安裝位置,那麼預設的位置/usr/local/nginx目錄--sbin-path=path 設置nginx執行腳本的位置,這裡如果設置在p ...


一、基本的編譯與安裝

1、安裝依賴項

sudo apt-get update
sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libssl-dev libxslt1-dev libxml2-dev libgd2-xpm-dev libgeoip-dev libgoogle-perftools-dev libperl-dev libtool
sudo apt-get install openssl

2、下載新版本,到官網複製下載鏈接

wget http://nginx.org/download/nginx-1.13.5.tar.gz

3、解壓

tar -zxvf nginx-1.13.5.tar.gz

4、編譯安裝

# 進入解壓目錄:
cd nginx-1.13.5
# 配置:這裡額外安裝幾個模塊
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream --with-mail=dynamic

# 編輯nginx:
sudo make
# 安裝nginx:
sudo make install
# 啟動nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#註意:-c 指定配置文件的路徑,不加的話,nginx會自動載入預設路徑的配置文件,可以通過 -h查看幫助命令。

# 查看nginx進程:
ps -ef|grep nginx

# 建立軟鏈接(由於/usr/local/bin包含於$PATH當中,這樣就不需要額外的設置環境變數了,這意味著可以在其他路徑下直接運行nginx命令)
sudo ln -s /opt/dotnet/dotnet /usr/local/bin #(創建鏈接)

 編譯選項說明:

--prefix=path 如果在編譯的不指定安裝位置,那麼預設的位置/usr/local/nginx目錄
--sbin-path=path 設置nginx執行腳本的位置,這裡如果設置在path變數裡面,就可以在bash環境下,任意使用nginx命令,預設位置prefix/sbin/nginx  註意這裡的prefix是在配置文件裡面配置的路徑
--conf-path=path 配置nginx配置文件的路徑,如果不指定這個選項,那麼配置文件的預設路徑就會是 prefix/conf/nginx.conf
--pid-path =path 配置nginx.pid file的路徑,一般來說,進程在運行的時候的時候有一個進程id,這個id會保存在pid file裡面,預設的pid file的放置位置是prefix/logs/nginx.pid
--error-log-path=path 設置錯誤日誌的存放路徑,如果不指定,就預設 prefix/logs/error.log
--http-log-path= path 設置http訪問日誌的路徑,如果不指定,就預設 prefix/logs/access.log
--user=name 設置預設啟動進程的用戶,如果不指定,就預設 nobody
--group=name 設置這個用戶所在的用戶組,如果不指定,依然是nobody
--with-http_ssl_module 開啟HTTP SSL模塊,使NGINX可以支持HTTPS請求。需要安裝了OPENSSL  
--with-http_flv_module  
--with-http_stub_status_module 啟用 "server status" 頁
--without-http_gzip_module 禁用 ngx_http_gzip_module. 如果啟用,需要 zlib
--without-http_ssi_module 禁用 ngx_http_ssi_module  
--without-http_referer_module 禁用 ngx_http_referer_module  
--without-http_rewrite_module 禁用 ngx_http_rewrite_module. 如果啟用需要 PCRE 。  
--without-http_proxy_module 禁用 ngx_http_proxy_module  
--without-http_fastcgi_module 禁用 ngx_http_fastcgi_module  
--without-http_memcached_module 禁用 ngx_http_memcached_module  
--without-http_browser_module 禁用 ngx_http_browser_module 
--http-proxy-temp-path=PATH 設置路徑到the http proxy temporary files  
--http-fastcgi-temp-path=PATH 設置路徑到Set path to the http fastcgi temporary files  
--without-http 禁用 HTTP server
--with-mail 啟用 IMAP4/POP3/SMTP 代理模塊  
--with-mail_ssl_module 啟用ngx_mail_ssl_module  
--with-openssl=DIR 設置路徑到OpenSSL library sources  
--with-stream 用來實現四層協議的轉發、代理或者負載均衡等

二、ssl的相關配置

1、使用自己生成的證書(僅作測試或加密數據用,不被主流瀏覽器支持) 

# 建立伺服器私鑰(過程需要輸入密碼,請記住這個密碼)生成RSA密鑰
sudo openssl genrsa -des3 -out testcert.key 1024  
# 生成一個證書請求   
# 需要依次輸入國家,地區,組織,email。
# 最重要的是有一個common name,可以寫你的名字或者功能變數名稱。如果為了https申請(不使用自己生成的證書,向CA申請),這個必須和功能變數名稱吻合,否則會引發瀏覽器警報。生成的csr文件交給CA簽名後形成服務端自己的證書
sudo openssl req -new -key testcert.key -out testcert.csr
# 生成不需要密碼的key
sudo openssl rsa -in testcert.key -out testcert_nopwd.key  
# 生成crt文件
sudo openssl x509 -req -days 365 -in testcert.csr -signkey testcert_nopwd.key -out testcert.crt  

之後將testcert_nopwd.key、testcert.csr、testcert.crt文件複製到 /etc/ssl/certs 目錄下

然後配置 nginx.conf 文件

由於在編譯中設置的路徑是/usr/local/nginx,因此該文件位於/usr/local/nginx/conf 目錄下。
打開改文件,在http模塊作如下設置:
ssl_certificate /etc/ssl/certs/testcert.crt;
ssl_certificate_key /etc/ssl/certs/testcert.key;

 具體的代碼:

http {
    include       proxy.conf;
    include       mime.types;
    default_type  application/octet-stream;  

    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    server_tokens off;
    
    sendfile        on;
    #tcp_nopush     on;
   
    keepalive_timeout  29;
    client_body_timeout 10; 
    client_header_timeout 10; 
    send_timeout 10;
    #gzip  on;

    # mvctest是一個名稱,與具體的程式相關
    upstream mvctest{
        server localhost:5000;
    }

    server {
       
        listen       80;
        add_header Strict-Transport-Security max-age=15768000;
        return 301 https://$host$request_uri;
    }

    server {
        listen *:443    ssl;
        server_name     localhost;
        ssl_certificate /etc/ssl/certs/testcert.crt;
        ssl_certificate_key /etc/ssl/certs/testcert.key;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on; #ensure your cert is capable
        ssl_stapling_verify on; #ensure your cert is capable

        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;

        #Redirects all traffic
        location / {
            proxy_pass  http://localhost:5000;
            limit_req   zone=one burst=10 nodelay;
            limit_req_status 503;
        }
    }

}

上面定義的區功能變數名稱稱為one(zone=one),分配記憶體大小為10m(如果限制域的存儲空間耗盡了,對於後續所有請求,伺服器都會返回 503),
同一個ip($binary_remote_addr)平均處理的請求頻率不能超過每秒5次(rate=5r/s); 如果超過每秒5次但超過的請求數量小於等於10(burst=10)時,會延遲請求。
如果超過每秒5次的請求數超過10,則立即返回503(limit_req_status 503)給客戶端

2、申請證書
常用免費證書:https://letsencrypt.org/
通常來說,將CSR文件(生成方式同上,或者按照CA的要求)就是你需要提交給 SSL 認證機構的,當你的功能變數名稱或組織通過驗證後,認證機構就會頒發給你兩個文件:test_com.crt和test_com.ca-bundle
而test_com.key是需要用在 Nginx 配置里和test_com.crt、test_com.ca-bundle配合使用的,需要好好保管。

#使用cat命令生成
cat test_com.crt  test_com.ca-bundle > test_com.pem

最終得到兩個文件:test_com.key和test_com.pem,為了統一位置,可以把這二個文件都移動到 /etc/ssl/private 目錄或者 /etc/ssl/cert 目錄。
然後可以修改nginx.conf文件,如下:

server {  
    #...
    ssl on;
    ssl_certificate /etc/ssl/private/test_com.pem;
    ssl_certificate_key /etc/ssl/private/test_com.key;
    #...

}

同使用自生成證書基本一樣,只是重新替換為認證機構頒發的證書而已。

3、迪菲-赫爾曼密鑰交換
以上這麼做並不安全,預設是 SHA-1 形式,而現在主流的方案應該都避免 SHA-1,為了確保更強的安全性,我們可以採取迪菲-赫爾曼密鑰交換
首先,進入/etc/ssl/certs目錄,執行命令 sudo  openssl dhparam -out dhparam.pem 4096 生成一個dhparam.pem 

test@test-VirtualBox:/etc/ssl/certs$ sudo  openssl dhparam -out dhparam.pem 4096
[sudo] test 的密碼:
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
# ...會等一段時間,與機器性能有關...
#完成後可以查看生成的文件
test@test-VirtualBox:~$ cd /etc/ssl/certs/
test@test-VirtualBox:/etc/ssl/certs$ ll dhparam.pem 
-rw-r--r-- 1 root root 769 9月  27 11:49 dhparam.pem

修改 nginx.conf 文件,添加 ssl_dhparam /etc/ssl/certs/dhparam.pem; 即可

ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

 

三、啟動相關

1、常用命令

#啟動 Nginx
/usr/local/nginx/sbin/nginx 
./sbin/nginx 
#停止 Nginx
./sbin/nginx -s stop 
./sbin/nginx -s quit
# -s都是採用向 Nginx 發送信號的方式。
#Nginx重新載入配置
./sbin/nginx -s reload
#指定配置文件
./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#-c表示configuration,指定配置文件
#查看 Nginx 版本
./sbin/nginx -v
#幫助
./sbin/nginx -h
./sbin/nginx -?

2、自動啟動
編譯安裝需要自己進行設置方可自動啟動

# 設置nginx自啟動,在/lib/systemd/system/ 目錄下創建一個服務文件
vim /lib/systemd/system/nginx.service

內容如下:

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target

文件說明
[Unit]部分
Description:描述服務
After:依賴,當依賴的服務啟動之後再啟動自定義的服務

[Service]部分
Type=forking是後臺運行的形式
ExecStart為服務的具體運行命令(需要根據路徑適配)
ExecReload為重啟命令(需要根據路徑適配)
ExecStop為停止命令(需要根據路徑適配)
PrivateTmp=True表示給服務分配獨立的臨時空間
註意:啟動、重啟、停止命令全部要求使用絕對路徑

[Install]部分
服務安裝的相關設置,可設置為多用戶

# 設置了自啟動後,任意目錄下執行
systemctl enable nginx.service
# 啟動nginx服務
systemctl start nginx.service
# 設置開機自動啟動
systemctl enable nginx.service
# 停止開機自動啟動
systemctl disable nginx.service
# 查看狀態
systemctl status nginx.service
# 重啟服務
systemctl restart nginx.service
# 查看所有服務
systemctl list-units --type=service

四、可能遇到的問題
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/ssl/certs/testcert.key") failed (SSL: error:0906406D:PEM routines:....
nginx啟動的時候需要輸入證書密碼,解決辦法是可以使用私鑰來生成解密後的key來代替,效果是一樣的(就跟ssh連接差不多),達到免密碼重啟的效果:
openssl rsa -in testcert.key -out untestcert.key
接下來你只需要在nginx裡面使用新的untestcert.key即可使用https連接了。

nginx: [emerg] zero size shared memory zone "oneip"
出現此錯誤都是因為在未指定limit_req_zone指定就使用了limit_req指令的原因(或者limit_req中的name值和limit_req_zone中定義的name值不一致)。

 


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

-Advertisement-
Play Games
更多相關文章
  • 簡單的介紹一下,我使用MongoDB的場景。 我們現在的物聯網環境下,有部分數據,採樣頻率為2000條記錄/分鐘,這樣下來一天24*60*2000=2880000約等於300萬條數據,以後必然還會增加。之前資料庫使用的是mssql,對於資料庫的壓力很大,同時又需要保證歷史查詢的響應速度,這種情況下, ...
  • 原文發表於cu:2017-06-12 本文簡單介紹MySQL雙主複製原理及1個簡單是雙主複製驗證。 一.MySQL雙主複製原理 1. 雙主複製原理 master-master複製的兩台伺服器,既是master,又是另一臺伺服器的slave,本質上互為主從。 二.驗證環境 1. 操作系統 CentOS ...
  • 1.把需要的腳本下載放到/root 目錄下,然後運行本腳本即可自動化安裝lnmp環境: ...
  • CentOS安裝Python3.X 1、系統環境說明 2、安裝軟體說明 2.1 python軟體包版本3.5.2 2.2 軟體安裝目錄為/application、/home/oldboy/tools 存放源碼包 2.3 CentOS 6.4自帶2.6,所以為了方便區分,將python3.X安裝在/a ...
  • 換了台本子win7 64位,抽空做個雙系統,裝了下linux。 遇到開機問題:進linux可以正常使用,進win7花屏死機,初步估計是grub(此時的boot sector位grub)的問題,啟動器被破壞一種表現。 對應做了以下處理: 1、在linux下修改/boot/grub/gurb.cfg,把 ...
  • 1.查看Firewall 服務狀態 2.查看Firewall 的狀態 註意: firewalld預設配置文件有兩個:/usr/lib/firewalld/ (系統配置,儘量不要修改)和 /etc/firewalld/ (用戶配置地址) 先把ssh的埠改下 防止不能遠程操作了 3、開啟、重啟、關閉、 ...
  • PIC中檔系列單片機,每條指令14位,共有35條彙編指令,根據操作對象不同,可將其分為三類: 位元組操作類指令 位操作類指令 立即數與控制類操作指令 1、位元組操作類指令,以MOVF指令為例: 指令:MOVF f, d 說明: 功能:寄存器f值傳送; MOVF為助記符,即操作指令,大小寫均可; f代表文 ...
  • 1》虛擬化技術: 電腦虛擬化技術是多種技術的綜合實現,它包括硬體平臺,操作系統,存儲以及網路等,簡單地說,虛擬化技術就是在單台主機上可以虛擬多個虛假主機,並可以在這些虛擬主機上運行不同的操作系統平臺,虛擬化技術的出現可以節約大量的硬體資源與能源消耗,降低資金成本,虛擬化現在已經是每個企業必有的項目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...