今天咱們的目標就是在 Centos上搭建好 Nginx 服務,方便後續開展各類測試和學習。這也是學習其餘互聯網組件的第一步。接下來,我將分步驟描述源碼編譯的過程,並作部分說明。html
目前官方最新版本(截止到2019年12月12日)爲 1.17.6,咱們直接去官網找到下載地址。不推薦直接使用 yum 安裝,由於存在以下兩個問題:mysql
版本太舊,以 CentOS 爲例,直接 yum 安裝的版本是 1.12.2 版本,已經嚴重脫離了時代;linux
沒法自定義安裝模塊,安裝目錄等等,不方便後續的實驗。nginx
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) [root@localhost ~]# cd /usr/local/src # 下載nginx安裝包[root@localhost src]# wget https://www.linuxprobe.com/Software/nginx-1.6.0.tar.gz # 解壓安裝包[root@localhost src]# tar -xzf nginx-1.6.0.tar.gz
Nginx 是徹底使用 C 語言開發的,因此必需要有 C 編譯環境,每每 CentOS 7.6 的環境會預裝 gcc 編譯器,因此不用額外安裝,若是沒有使用 yum 直接安裝便可。另外,咱們使用 Nginx 的壓縮功能、正則表達式功能等,須要安裝一些額外的依賴庫,這是必需要作的,否則在編譯階段就會報錯。以下3個是比較 Nginx 中比較經常使用模塊所依賴的庫,請在執行 Nginx 源碼編譯時提早安裝好。web
下載Nginx安裝所須要的依賴庫包正則表達式
[root@localhost ~]# cd /usr/local/src [root@localhost src]# ls Python-3.7.0.tar.xz [root@localhost src]# wget https://www.linuxprobe.com/Software/zlib-1.2.8.tar.gz --2020-05-17 20:35:36-- https://www.linuxprobe.com/Software/zlib-1.2.8.tar.gz 正在解析主機 www.linuxprobe.com (www.linuxprobe.com)... 183.240.224.121, 183.240.224.114, 183.240.224.116, ... 正在鏈接 www.linuxprobe.com (www.linuxprobe.com)|183.240.224.121|:443... 已鏈接。 已發出 HTTP 請求,正在等待迴應... 200 OK 長度:571091 (558K) [application/octet-stream] 正在保存至: 「zlib-1.2.8.tar.gz」 100%[==============================================================================================================================>] 571,091 1.16MB/s 用時 0.5s 2020-05-17 20:35:37 (1.16 MB/s) - 已保存 「zlib-1.2.8.tar.gz」 [571091/571091]) [root@localhost src]# wget https://www.linuxprobe.com/Software/pcre-8.35.tar.gz --2020-05-17 20:36:12-- https://www.linuxprobe.com/Software/pcre-8.35.tar.gz 正在解析主機 www.linuxprobe.com (www.linuxprobe.com)... 183.240.224.115, 183.240.224.119, 183.240.224.120, ... 正在鏈接 www.linuxprobe.com (www.linuxprobe.com)|183.240.224.115|:443... 已鏈接。 已發出 HTTP 請求,正在等待迴應... 200 OK 長度:1996552 (1.9M) [application/octet-stream] 正在保存至: 「pcre-8.35.tar.gz」 100%[==============================================================================================================================>] 1,996,552 2.94MB/s 用時 0.6s 2020-05-17 20:36:13 (2.94 MB/s) - 已保存 「pcre-8.35.tar.gz」 [1996552/1996552]) [root@localhost src]# wget https://www.linuxprobe.com/Software/openssl-1.0.1h.tar.gz --2020-05-17 20:36:54-- https://www.linuxprobe.com/Software/openssl-1.0.1h.tar.gz 正在解析主機 www.linuxprobe.com (www.linuxprobe.com)... 183.240.224.120, 183.240.224.116, 183.240.224.117, ... 正在鏈接 www.linuxprobe.com (www.linuxprobe.com)|183.240.224.120|:443... 已鏈接。 已發出 HTTP 請求,正在等待迴應... 200 OK 長度:4475692 (4.3M) [application/octet-stream] 正在保存至: 「openssl-1.0.1h.tar.gz」 100%[==============================================================================================================================>] 4,475,692 3.93MB/s 用時 1.1s 2020-05-17 20:36:57 (3.93 MB/s) - 已保存 「openssl-1.0.1h.tar.gz」 [4475692/4475692]) [root@localhost src]# ls openssl-1.0.1h.tar.gz pcre-8.35.tar.gz Python-3.7.0.tar.xz zlib-1.2.8.tar.gz [root@localhost src]#
在正式安裝Nginx服務程序以前,咱們還須要爲其解決相關的軟件依賴關係,例如用於提供Perl語言兼容的正則表達式庫的軟件包pcre,就是Nginx服務程序用於實現僞靜態功能必不可少的依賴包。下面來解壓、編譯、生成、安裝Nginx服務程序的源碼文件:sql
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# ls openssl-1.0.1h.tar.gz pcre-8.35.tar.gz Python-3.7.0.tar.xz zlib-1.2.8.tar.gz [root@localhost src]# tar xzvf pcre-8.35.tar.gz [root@localhost src]# cd pcre-8.35 [root@localhost pcre-8.35]# ./configure --prefix=/usr/local/pcre [root@localhost pcre-8.35]# make [root@localhost pcre-8.35]# make install
openssl軟件包是用於提供網站加密證書服務的程序文件,在安裝該程序時須要自定義服務程序的安裝目錄,以便於稍後調用它們的時候更可控。vim
[root@localhost pcre-8.35]# cd /usr/local/src [root@localhost src]# ls openssl-1.0.1h.tar.gz pcre-8.35 pcre-8.35.tar.gz Python-3.7.0.tar.xz zlib-1.2.8.tar.gz [root@localhost src]# tar xzvf openssl-1.0.1h.tar.gz [root@localhost src]# cd openssl-1.0.1h [root@localhost openssl-1.0.1h]# ./config --prefix=/usr/local/openssl [root@localhost openssl-1.0.1h]# make [root@localhost openssl-1.0.1h]# make install
openssl軟件包安裝後默認會在/usr/local/openssl/bin目錄中提供不少的可用命令,咱們須要像前面的操做那樣,將這個目錄添加到PATH環境變量中,並寫入到配置文件中,最後執行source命令以便讓新的PATH環境變量內容能夠當即生效:
瀏覽器
[root@linuxprobe pcre-8.35]# vim /etc/profile ………………省略部分輸出信息……………… 64 65 for i in /etc/profile.d/*.sh ; do 66 if [ -r "$i" ]; then 67 if [ "${-#*i}" != "$-" ]; then 68 . "$i" 69 else 70 . "$i" >/dev/null 71 fi 72 fi 73 done 74 export PATH=$PATH:/usr/local/mysql/bin:/usr/local/openssl/bin 75 unset i 76 unset -f pathmunge [root@linuxprobe pcre-8.35]# source /etc/profile
zlib軟件包是用於提供壓縮功能的函數庫文件。其實Nginx服務程序調用的這些服務程序無需深刻了解,只要大體瞭解其做用就已經足夠了:
bash
[root@localhost openssl-1.0.1h]# cd /usr/local/src [root@localhost src]# ls openssl-1.0.1h openssl-1.0.1h.tar.gz pcre-8.35 pcre-8.35.tar.gz Python-3.7.0.tar.xz zlib-1.2.8.tar.gz [root@localhost src]# tar xzvf zlib-1.2.8.tar.gz [root@localhost src]# cd zlib-1.2.8 [root@localhost zlib-1.2.8]# ./configure --prefix=/usr/local/zlib [root@localhost zlib-1.2.8]# make [root@localhost zlib-1.2.8]# make install
依賴庫安裝好後重啓系統
[root@localhost nginx-1.17.6]# reboot
編譯並安裝Nginx
[root@localhost mysql-5.6.19]# cd /usr/local/src [root@localhost src]# useradd www -s /sbin/nologin [root@localhost nginx-1.6.0]# make install
特別是在 Nginx 中,能夠指定安裝某些或者不安裝某些模塊,默認安裝的模塊只適合簡單的場景,每每在稍微複雜的狀況下,就須要額外添加其餘模塊,或者第三方以及自定義的模塊。這高可擴展性正是 Nginx 的一大亮點。想要查看 configure 的可選參數,使用 --help 選項便可:
$ ./configure --help
在全部可選參數中,最經常使用的有兩個:
–prefix=PATH:配置 Nginx 安裝部署的根目錄。相似於在 Windows 下安裝軟件,咱們指定安裝目錄;
–with-xxx_module:–without-xxx_module 其中 xxx 表示 Nginx 一個模塊的名稱,例如:
with-http_ssl_module -> 支持SSL/TLS,即HTTPS
with-http_v2_module -> 支持HTTP/2
without-http_fastcgi_module -> 不使用fastcgi
爲了後續測試功能完善,這裏咱們編譯時候,儘量多的引入一些模塊:
要想啓動Nginx服務程序以及將其加入到開機啓動項中,也須要有腳本文件。惋惜的是,在安裝完Nginx軟件包以後默認並無爲用戶提供腳本文件,所以劉遄老師給各位讀者準備了一份可用的啓動腳本文件,你們只需在/etc/rc.d/init.d目錄中建立腳本文件並直接複製下面的腳本內容便可(相信各位讀者在掌握了第4章的內容以後,應該能夠順利看懂這個腳本文件)。
[root@linuxprobe nginx-1.6.0]# vim /etc/rc.d/init.d/nginx#!/bin/bash # nginx - this script starts and stops the nginx daemon # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /usr/local/nginx/conf/nginx.conf # pidfile: /usr/local/nginx/logs/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { #configtest || return $? stop sleep 1 start } reload() { #configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
保存腳本文件後記得爲其賦予755權限,以便可以執行這個腳本。而後以絕對路徑的方式執行這個腳本,經過restart參數重啓Nginx服務程序,最後再使用chkconfig命令將Nginx服務程序添加至開機啓動項中。大功告成!
[root@linuxprobe nginx-1.6.0]# chmod 755 /etc/rc.d/init.d/nginx [root@linuxprobe nginx-1.6.0]# /etc/rc.d/init.d/nginx restart Restarting nginx (via systemctl): [ OK ] [root@linuxprobe nginx-1.6.0]# chkconfig nginx on
啓動 Nginx 後,首先使用ps -ef | grep nginx
能夠查看 Nginx 進程是否已經啓動,基於默認的配置,咱們將看到 2 個 Nginx 的啓動進程:master 進程和 worker 進程。
這是咱們在前面講到的 Nginx 的 Master-Worker 機制,後面會進行詳細講解。另外,咱們能夠用命令 netstat -anltp | grep 80
,看到 CentOS 上已經在監聽 80 端口,而這個監聽服務正是 Nginx。最後能夠用瀏覽器或者 curl 命令直接在 CentOS 機器上檢查 Nginx 服務:
[root@localhost ~]# curl http://localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [root@localhost ~]# ps -ef |grep nginx root 37071 1 0 22:46 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf www 37073 37071 0 22:46 ? 00:00:00 nginx: worker process root 37105 2397 0 22:49 pts/0 00:00:00 grep --color=auto nginx [root@localhost ~]#
當出現 「Welcome to Nginx!" 這樣的歡迎語句,代表咱們的 Nginx 已經正常運行了。