Nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由俄羅斯的程序設計師IgorSysoev爲俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like協議下發行。其特點是佔有內存少,併發能力強。在高併發連接的情況下,Nginx是Apache服務器不錯的替代品。Nginx同時也可以作爲7層負載均衡服務器來使用。Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 可以承受3萬以上的併發連接數,相當於同等環境下Apache的10倍。
自Nginx 發佈四年來,Nginx 已經因爲它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。目前國內各大門戶網站已經部署了Nginx,如京東、新浪、網易、騰訊、淘寶等;國內幾個重要的視頻分享網站也部署了Nginx,如六房間、酷6等。
Nginx工作模式(轉)
Nginx由內核和模塊組成,其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每個指令將會啓動不同的模塊去完成相應的工作。
Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊,HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊,HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊屬於基本模塊,而HTTP Upstream Request Hash模塊、Notice模塊和HTTPAccess Key模塊屬於第三方模塊,用戶根據自己的需要開發的模塊都屬於第三方模塊。正是有了這麼多模塊的支撐,Nginx的功能纔會如此強大。
Nginx的模塊從功能上分爲三類,分別是:
Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操作。handlers處理器模塊一般只能有一個。
Filters (過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx 輸出。
Proxies (代理類模塊)。就是Nginx 的HTTPUpstream 之類的模塊
在工作方式上,Nginx分爲單工作進程和多工作進程兩種模式。
在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;
在多工作進程模式下,每個工作進程包含多個線程。
Nginx默認爲單工作進程模式。
Nginx的模塊直接被編譯進Nginx,因此屬於靜態編譯方式。啓動Nginx後,Nginx的模塊被自動加載,不像在Apache一樣,首先將模塊編譯爲一個so文件,然後在配置文件中指定是否進行加載。在解析配置文件時,Nginx的每個模塊都有可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。
如果由FastCGI或其它代理服務器處理單頁中存在的多個SSI,則這項處理可以並行運行,而不需要相互等待。
Nginx 通過事件驅動相應多個用戶,使用一個工作線程來響應多個不同的用戶請求
prework 是一個進程響應一個用戶請求
worker是一個線程響應一個用戶請求
爲此nginx適合於高併發的場景需求,並且nginx對靜態內容響應較快,但是nginx不支持CGI
在應用是nginx時,nginx主要是工作在web的前端,實現反向代理
1.原碼安裝
獲取nginx壓縮包
[root@server1 ~]# tar zxfnginx-1.10.1.tar.gz
通過修改文件使得安裝的nginx不顯示版本號更加安全。
[root@server1 ~]# ls
anaconda-ks.cfg install.log install.log.syslog nginx-1.10.1 nginx-1.10.1.tar.gz
[root@server1 ~]# cd nginx-1.10.1/src/core/
[root@server1 core]# vim nginx.h
vim nginx.h
如圖做修改。去掉版本號。
./configure --prefix=/usr/local/lnmp/nginx--user=nginx --group=nginx --with-
http_stub_status_module--with-http_ssl_module
[[email protected]]# ./configure --prefix=/usr/local/lnmp/nginx--with-http_ssl_module --with-http_stub_status_module
出現如下圖錯誤提示
[root@server1 nginx-1.10.1]# yum install pcre-devel -y
出現如下圖錯誤
[[email protected]]# yum install openssl-devel -y
[[email protected]]# ./configure --prefix=/usr/local/lnmp/nginx--with-http_ssl_module --with-http_stub_status_module
然後 [[email protected]]# make && make install
[[email protected]]# cd /usr/local/lnmp/nginx/sbin/
[root@server1sbin]# ./nginx
[root@server1sbin]# netstat -antlp
[root@server1sbin]# curl -I localhost
開機自啓動
[root@server1~]# vim /etc/rc.local
添加軟連接
[root@server1~]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/
網頁測試
自動監控模塊
location/status {
stub_status on;
access_log off;
}
2加載動態模塊
3修改/usr/local/lnmp/nginx/conf/nginx.conf優化nginx功能
[root@server1~]# ps aux
[root@server1~]# lscpu
[root@server1~]# vim /usr/local/lnmp/nginx/conf/nginx.conf
[root@server1~]# nginx -t
nginx:the configuration file /usr/local/lnmp/nginx/conf/nginx.conf syntax is ok
nginx:configuration file /usr/local/lnmp/nginx/conf/nginx.conf test is successful
[root@server1~]# nginx -s reload
[root@server1~]# ulimit
unlimited
[root@server1~]# ulimit -a
Shell 炸彈(將cpu內存全部佔滿)
[root@server1~]# :(){ :|:& };:
如果按下面方法限制用戶使用的進程數量,會避免shell炸彈把內存佔滿而卡死
[root@server1~]# vim /etc/security/limits.conf
4.製作證書
server {
listen 443 ssl;
server_name server1.example.com;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
[root@server1~]# cd /etc/pki/tls/certs/
[root@server1certs]# ls
ca-bundle.crt ca-bundle.trust.crt make-dummy-cert Makefile renew-dummy-cert
[root@server1certs]# make cert.pem
出現如下圖
對應位置寫入相關內容:
CountryName (2 letter code) [XX]:CN
State orProvince Name (full name) []:shanghai
LocalityName (eg, city) [Default City]:shanghai
OrganizationName (eg, company) [Default Company Ltd]:westos
OrganizationalUnit Name (eg, section) []:linux
CommonName (eg, your name or your server's hostname) []:server1.example.com
EmailAddress []:[email protected]
生成證書後
[root@server1certs]# mv cert.pem /usr/local/lnmp/nginx/conf/
[root@server1~]# vim /usr/local/lnmp/nginx/conf/nginx.conf
加入網頁重寫
[root@server1certs]# nginx -t
[root@server1certs]# nginx -s reload
完成http https之間的轉換。
網頁測試
網頁重定向
<body>
<noscript><metahttp-equiv="refresh"content="0;url=http://server2.example.com"></noscript>
<h1>Welcometo nginx!</h1>
這是web網頁的寫法,比網頁重寫快更加優化。
5虛擬主機
server {
listen 80;
server_name www.westos.org;
location / {
root /www2;
index index.html;
}
}
server {
listen 80;
server_name www.linux.org;
location / {
root /www2;
index index.html;
}
}
6負載均衡
http {
upstream westos{
server 172.25.99.2:80;
server 172.25.99.3:80;
server 127.0.0.1:80 backup;
}
server {
listen 80;
server_name www.westos.org;
location / {
proxy_pass http://westos;
}
}
server {
listen 80;
server_name www.linux.org;
location / {
root /www2;
index index.html;
}
}