What is Nginx?
Nginx與Apach類似,是一款高性能的HTTP和反向代理服務器軟件,由俄羅斯程序員 lgor Sysoev開發,可以運行在 UNIX、GNU\LINUX、BSD、Mac OS X、Solaris及Microsoft Windwos等操作系統中;
What 使用 Nginx?
Nginx和Apache一樣,都是HTTP服務器軟件,在功能實現上都採用模塊化結構設計,都支持通用語言接口,如PHP、Perl、Python等,同時還支持正向和反向代理、虛擬主機URL重寫、壓縮傳輸、SSL 加密傳輸等,它們之間最大差別是Apache所有模塊都支持動、靜態編譯,而Nginx模塊都是靜態編譯的,同時 Apache對Fcgi支持不太好,而Nginx對Fcgi支持非常好,在處理連接方式上,Nginx支持epoll,而Apache卻不支持,在空間使用上,Nginx安裝包僅有幾百K,與Nginx比起來,Apache顯得非常龐大;
Nginx模塊與工作原理:
Nginx由內核與模塊組成,內核的設計非常微小簡潔,完成的工作非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個 location block (location 是Nginx配置中的一個指令,用於URL匹配),location中所配置的每個指令將會啓動不同的模塊完成相應的工作;
Nginx模塊從結構上分爲核心模塊、基礎模塊和第三方模塊,HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊,HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite屬於基礎模塊,其它任何用戶根據自己需要開發的模塊都屬於第三方模塊,Nginx有着衆多的模塊,所以變得特別強大;
Nginx模塊從功能上分爲三類:
Handlers(處理器模塊)此類模塊直接處理請求,並進行輸出內容和修改headers信息等操作,Handlers處理模塊一般只能有一個;
Filter(過濾器模塊)此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx輸出
Proxies(代理類模塊)此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能;
Nginx分爲單工作進程和多工作進程兩種模式:
單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;
多工作進程模式下,每個工作進程包含多個線程,Nginx默認爲單工作進程模式;
Nginx的模塊直接被編譯進Nginx,因此屬於靜態編譯方式,啓動Nginx後,Nginx的模塊被自動加載,不像Apache,首先將模塊編譯爲一個so文件,然後在配置文件中指定是否加載;
Nginx官方站點:http://nginx.org/
Nginx分爲三個版本:穩定版、開發版與歷史穩定版;
次版本號爲偶數即爲穩定版,奇數爲開發版,穩定版都是經過了生產環境的嚴格測試,因此建議生產環境中,選擇次版本號爲偶數的穩定版;
# 目前最新版本爲 Nginx 1.7.9;
# 此處以1.6.2爲示例,進行編譯:
Nginx 6.2官方下載鏈接:
http://nginx.org/download/nginx-1.6.2.tar.gz
Nginx安裝過程非常簡單,默認情況下,編譯安裝Nginx包含了大部分可用模塊,可通過"./configure --help" 選項查看 Nginx編譯時可以接受的選項,例如不需要 http_ssi模塊,可通過 "--without-http_ssi_module" 方式關閉,同理如果需要 "http_perl"模塊,可通過 "--with-http_perl_module"方式進行安裝;
tar zvf nginx-1.6.2.tar.gz cd nginx-1.6.2 ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi make make install
編譯三部曲:
1、configure命令是用來檢測你的安裝平臺的目標特徵的。它定義了系統的各個方面,包括nginx的被允許使用的連接處理的方法,比如它會檢測你是不是有CC或GCC,並不是需要CC或GCC,它是個shell腳本,執行結束時,它會創建一個Makefile文件。nginx的configure命令支持以下參數:
2、make用來編譯,它從Makefile中讀取指令,然後編譯。
3、make install用來安裝編譯後的程序,它從Makefile中讀取指令,並安裝到指定的位置。
--prefix=path # 指定Nginx 安裝位置,默認使用 /usr/local/nginx。
--sbin-path=path # 設置 nginx可執行文件路徑,默認爲 prefix/sbin/nginx。
--conf-path=path # 指定Nginx 配置文件存放路徑,nginx允許使用不同的配置文件啓動,通過 nginx -c選項,默認配置文件位置爲 prefix/conf/nginx.conf;
--pid-path=path/name.pid # 設置 nginx.pid文件位置,安裝完成後可在nginx.conf配置文件中更改位置,默認位置爲 prefix/logs/nginx.pid;
--error-log-path=path/name.log # 設置錯誤日誌位置及名稱,安裝完成後可在nginx.conf配置文件中更改位置,默認位置爲 prefix/logs/error.log;
--http-log-path=path/name.log # http訪問日誌路徑,安裝後可在nginx.conf配置文件中更改位置,默認位置爲 prefix/logs/access.log;
--user=name # 設置 nginx工作進程的用戶,安裝完成後可在Nginx.conf配置文件中用user指令更改,默認用戶爲 nobody;
--group=name # 設置nginx工作進程的用戶組,安裝後可在Nginx.conf配置文件中用user 指令更改;
--lock-path=path/name.lock # 指定鎖文件位置
--with-http_ssl_module # 支持https協議,默認不會編被編譯,編譯時需要安裝 openssl-devel
--with-http_stub_status_module # http狀態模塊,默認不會被編譯,可通過網頁輸出http狀態
--with-http_gzip_static_module # 啓用 gzip 模塊用於網頁在傳輸時壓縮
--with-http_flv_module # 啓用 flv 流媒體模塊
--with-http_mp4_module # 啓用 httpd_mp4 mp4格式流媒體模塊
--http-client-body-temp-path= # body 的臨時存放路徑
--http-proxy-temp-path= # proxy 臨時存放路徑
--http-fastcgi-temp-path= # fsstcgi 臨時存放路徑
Nginx命令:
/usr/local/sbin/nginx 啓動Nginx服務
/usr/local/sbin/nginx -t 測試配置文件語法
/usr/local/sbin/gginx -t -c /path/some Nginx支持使用不同的配置文件啓動 -c 指定不同的配置文件
/usr/local/sbin/nginx -v 查看 Nginx 版本
/usr/local/sbin/nginx -V 顯示Nginx版本與編譯時都用了哪些額外選項
Nginx對進程的控制能力非常強大,可通過信號指令控制進程:
常用的信號 :
HUP:表示重新加載配置,也就是關閉原有進程,並開啓新的進程;此操作不會中斷用戶的訪問請求,因此可以用此信號平滑重啓Nginx;
USR1:用於Nginx日誌切換,重新打開一個日誌文件,例如每天要生成一個新日誌文件時,可用這個信號來控制;
USR2:用於平滑升級可執行程序
QUIT:處理完所有請求以後,關閉該進程
獲取Nginx PID 方法:
ps -ef |grep "nginx:master process" |grep -v "grep" | awk -F' ' '{print $2} # 獲取Nginx所有進程的PID;
cat /usr/local/logs/nginx.pid # 如果編譯安裝時沒有指定Pid參數,默認在nginx程序所在目錄/logs/nginx.pid
例:
kill -HUP `cat /usr/local/nginx/logs/nginx.pid` # 此處使用了命令引用,先獲取pid,在向kill 向 nginx進程傳遞 HUP 信號;
基於虛擬主機配置Nginx:
vim /etc/nginx/nginx.conf server { listen 172.16.4.33:80; server_name www.nginx.com; root /www; location /www { index index.html index.htm; } } server { listen 172.16.4.33:80; server_name www.domain.com; root /qqq location /qqq { index index.html index.htm; } }
準備主頁文件:
mkdir /www /qqq echo "Welcome to nginx. > /www/index.html echo "Welcome to domian. > /qqq/index.html
啓動Nginx:
/usr/local/nginx/sbin/nginx
# 此時即定義了兩個虛擬主機,關於配置文件含義在另一篇博客中有詳解,此處就不在做介紹;
測試方法:
做一臺DNS服務器,建立一條兩條A記錄,分別指向這兩臺虛擬主機,或直接修改客戶端的hosts文件,將這兩個域名與IP的對應關係寫在其中即可;
OK,兩個虛擬主機都測試成功;
基於端口:
vim /etc/nginx/nginx.conf server { listen 172.16.4.33:888; server_name www.nginx.com; root /www; location /www { index index.html index.htm; } } server { listen 172.16.4.33:999; server_name www.nginx.com; root /qqq location /qqq { index index.html index.htm; } }
此時在用瀏覽器加上端口訪問即可;
基於Openssl 服務實現 https:
環境,CA及與Nginx在同一臺機器上;
1、爲CA生成自簽證書:
cd /etc/pki/CA (umask 077;openssl genrsa -out private/cakey.pem 2048)
[root@bogon CA]# openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:MageEdu Organizational Unit Name (eg, section) []:tech Common Name (eg, your name or your server's hostname) []:example.com Email Address []:[email protected] [root@bogon CA]# touch {index.txt,serial} [root@bogon CA]# echo 01 > serial
2、爲Nginx生成私鑰,並申請證書:
cd /etc/nginx/ (umask 077;openssl genrsa -out nginx.key 2048)
[root@bogon nginx]# openssl req -new -key nginx.key -out nginx.csr -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:MageEdu Organizational Unit Name (eg, section) []:tech Common Name (eg, your name or your server's hostname) []:nginx.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
3、簽署證書:
[root@bogon nginx]# openssl ca -in nginx.csr -out nginx.crt -days 365
4、更改Nginx配置文件,支持https:(默認Nginx的SSL配置文件是註釋的,啓用起來即可)
server { listen 443 ssl; server_name www.nginx.com; ssl_certificate nginx.crt; ssl_certificate_key nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /www; index index.html index.htm; } } killall nginx /usr/local/nginx/sbin/nginx
5、導出CA證書到客戶機:
將剛剛爲CA自籤的證書cacert.pem 倒出到客戶機,並重命名爲 cacert.crt,雙擊倒入到受信任的根證書頒發機構:
6、驗證https工作是否正常:
OK,Nginx服務啓用https功能,到此處即完成,後綴還會發布Nginx反向代理,筆者水平有限,如有疏漏不妥之處,還請不吝賜教!