Nginx 源碼安裝和簡(jiǎn)單的配置
Nginx是一款開(kāi)放源代碼的高性能HTTP服務(wù)器和反向代理服務(wù)器仍源。Nginx以高性能顾犹、高可用竖席、豐富的功能模塊曾棕、簡(jiǎn)單明了的配置文檔以及低資源占用而著稱灯变,采用罪行的網(wǎng)絡(luò)I/O模型殴玛,支持高達(dá)50000個(gè)并發(fā)連接。
寫此篇筆記的時(shí)候添祸,最新版是1.11.2 (http://nginx.org/download/nginx-1.11.2.tar.gz
)滚粟,nginx最新版下載鏈接見(jiàn)官網(wǎng)
安裝示例(這里安裝在/usr/local/nginx中):
wget http://nginx.org/download/nginx-1.11.2.tar.gz
tar -xzvf nginx-1.11.2.tar.gz -C /usr/src
# 安裝依賴
sudo apt-get install gcc libpcre3 libpcre3-dev openssl libssl-dev libssl0.9.8 perl libperl-dev
cd /usr/src/nginx-1.11.2
# 以下是一行。刃泌。用于生成makefile凡壤。如果需要添加第三方模塊署尤,使用--add-module=/path/module1的方法編譯
./configure --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-mail --with-mail_ssl_module
# make是生成在objs目錄中,make install則安裝到prefix所示的目錄中
make && make install
# 沒(méi)有錯(cuò)誤出現(xiàn)的話亚侠,就可以進(jìn)入nginx安裝目錄(/usr/local/nginx)配置曹体。
成功安裝后,進(jìn)入/usr/local/nginx
硝烂,可以看到4個(gè)目錄:
root@iZ28xhlm5vhZ:/usr/local/nginx# ll
total 44
drwxr-xr-x 11 root root 4096 Jul 26 10:06 ./
drwxr-xr-x 12 root root 4096 Jul 26 10:03 ../
drwxr-xr-x 2 root root 4096 Jul 26 10:11 conf/
drwxr-xr-x 2 root root 4096 Jul 26 10:03 html/
drwxr-xr-x 2 root root 4096 Jul 26 10:07 logs/
drwxr-xr-x 2 root root 4096 Jul 26 10:03 sbin/
其中箕别,
- conf:放置nginx相關(guān)的配置文件,最核心的是nginx.conf
- html:默認(rèn)的網(wǎng)站根目錄
- logs:日志文件目錄(訪問(wèn)日志滞谢,錯(cuò)誤日志串稀,運(yùn)行時(shí)的進(jìn)程id
cat logs/nginx.pid
) - sbin:主程序(nginx)目錄
一些常用的命令(可以寫腳本簡(jiǎn)化管理):
1、啟動(dòng): /usr/local/nginx/sbin/nginx
2狮杨、關(guān)閉: /usr/local/nginx/sbin/nginx -s stop
3母截、重啟: /usr/local/nginx/sbin/nginx -s reload
4、指定(另外的)配置文件并啟動(dòng)(如果已經(jīng)啟動(dòng)則報(bào)端口占用的錯(cuò)誤): /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/new.conf
5禾酱、查看pid: cat /usr/local/nginx/logs/nginx.pid微酬,可以用于kill等操作
6绘趋、查看安裝時(shí)候的參數(shù): /usr/local/nginx/sbin/nginx -V
參考鏈接--如何在安裝成功的nginx中添加未編譯的安裝模塊(nginx添加模塊需要重新編譯nginx颤陶,而不是像Apache一樣配置文件引用動(dòng)態(tài)鏈接庫(kù)):
- 下載一個(gè)第三方庫(kù)用于測(cè)試,
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
陷遮,參考鏈接中是2.0的版本滓走,在我的服務(wù)器make生成的時(shí)候報(bào)錯(cuò)了,于是改成了最新版的2.3 - 解壓到主目錄中帽馋,
tar -xzvf ngx_cache_purge-2.3.tar.gz -C ~
- 進(jìn)入nginx源碼所在的目錄搅方,我的源碼放在/usr/src/nginx中,
cd /usr/src/nginx
- 查看當(dāng)前的nginx安裝使用了哪一些選項(xiàng)绽族,用于重新編譯姨涡,
/usr/local/nginx/sbin/nginx -V
,我的選項(xiàng)是--prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-mail --with-mail_ssl_module
- 在選項(xiàng)后添加需要添加的第三方模塊選項(xiàng)吧慢,添加
--add-module=/root/ngx_cache_purge-2.3
涛漂,注意/root是我的主目錄 - (重要的一步!)只需要make生成主程序而不安裝(在此之前可以查看一下objs目錄中的nginx文件的最后修改時(shí)間),
make
检诗,保證沒(méi)有報(bào)錯(cuò)(看到objs/nginx的最后修改時(shí)間已經(jīng)變化) - 替換啟動(dòng)文件匈仗,
cp /usr/local/nginx/sbin;mv nginx nginx.bak;cp /usr/src/nginx-1.11.2/objs/nginx .
- 啟動(dòng)或重啟nginx(命令略)
配置文件解析
# 當(dāng)生成一些文件的時(shí)候,所屬的用戶和組
user www-data;
# 啟動(dòng)子進(jìn)程(worker)數(shù)逢慌,可以通過(guò)`ps aux | grep nginx` 查看悠轩,一般設(shè)置成CPU核數(shù)。
worker_processer 1;
# 全局錯(cuò)誤日志攻泼,這里的“當(dāng)前目錄”為/usr/local/nginx
error_log logs/error.log; # 默認(rèn)
# 保存PID的log
pid logs/nginx.pid; # 默認(rèn)
# 工作模式和連接數(shù)上限
events{
# epoll是多路復(fù)用IO中的一種方式火架,僅用于linux2.6以上的內(nèi)核鉴象,可以大大提高nginx的性能
use epoll;
# 單個(gè)worker process進(jìn)程的最大并發(fā)連接數(shù),受系統(tǒng)文件句柄限制何鸡,即`ulimit -a`中open files項(xiàng)
worker_connections 65535;
}
# 設(shè)定http服務(wù)器
http{
# 設(shè)定mime類型炼列,mime.types為“文件類型定義”文件,“當(dāng)前目錄”為conf/
include mime.types;
# 默認(rèn)文件類型
default_type application/octet-stream;
# 默認(rèn)編碼
# charset utf-8;
# 反向代理配置音比,可以打開(kāi)proxy.conf看看
# include proxy.conf;
# fastcgi配置俭尖,可以打開(kāi)fastcgi.conf看看
# include fastcgi.conf;
# 定義log文件怎么寫
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 全局訪問(wèn)日志,使用以上定義的main格式
access_log logs/access.log main;
# sendfile指令指定nginx是否調(diào)用sendfile函數(shù)[零拷貝方式](http://baike.baidu.com/view/704944.htm)來(lái)輸出文件洞翩。這是一個(gè)提高通信效率但是降低數(shù)據(jù)傳輸速率的函數(shù)稽犁,只有在用來(lái)進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載的應(yīng)用中設(shè)置為off
sendfile on;
# 服務(wù)器的響應(yīng)頭部信息產(chǎn)生獨(dú)立的數(shù)據(jù)包發(fā)送,即一個(gè)響應(yīng)頭信息=>一個(gè)包
tcp_nopush on;
# 保持連接的超時(shí)時(shí)間
keepalive_timeout 65;
# 頁(yè)面壓縮后傳輸更節(jié)省流量
gzip on;
# 防止網(wǎng)絡(luò)阻塞
tcp_nodelay on;
# 服務(wù)器名字的hash表大小
# server_names_hash_bucket_size 128;
# 上傳文件大小限制
# client_header_buffer_size 32k;
# 設(shè)定請(qǐng)求緩存
# large_client_header_buffers 4 64k;
# client_max_body_size 8m;
# 開(kāi)啟限制IP連接數(shù)的時(shí)候需要使用
# limit_zone crawler $binary_remote_addr 10m;
# 包含每個(gè)server的配置
# include /usr/local/nginx/myconf/*.conf;
# server可以include進(jìn)來(lái)骚亿,也可以直接寫在后面已亥,用于定義虛擬主機(jī)。最重要的是字段是server_name和root
server{
# 服務(wù)器監(jiān)聽(tīng)端口
listen 7890;
# 訪問(wèn)域名
server_name www.example.com
# 編碼格式来屠,如果網(wǎng)頁(yè)編碼與此設(shè)置不同虑椎,則將被自動(dòng)轉(zhuǎn)碼,覆蓋全局的編碼俱笛。捆姜。
# charset koi8-r;
# 設(shè)置虛擬主機(jī)的訪問(wèn)日志
# access_log logs/www.example.com.access.log main;
# 對(duì)URL進(jìn)行匹配,訪問(wèn)server_name的時(shí)候進(jìn)入這里
location / {
# 網(wǎng)頁(yè)根目錄迎膜,“當(dāng)前目錄”在nginx的安裝目錄泥技,即/usr/local/nginx,可以用絕對(duì)路徑或相對(duì)路徑磕仅,以下的html是相對(duì)安裝目錄
root html;
# 默認(rèn)的首頁(yè)文件(有先后順序)珊豹,訪問(wèn)www.example.com則尋找root下的index.html返回,如果找不到榕订,就找index.htm
index index.html index.htm;
}
# 設(shè)置錯(cuò)誤代碼對(duì)應(yīng)的錯(cuò)誤頁(yè)面
# error_page 404 /404.html
# error_page 500 502 503 504 /50x.html
# 略去配置代理和HTTPS Server
}
}
在Ubuntu上的簡(jiǎn)單的一個(gè)例子
首先在默認(rèn)的網(wǎng)站根目錄下建立虛擬主機(jī)的目錄和文件店茶,然后修改conf/nginx.conf配置并重啟nginx,由于不能用DNS域名解析來(lái)指向server_name劫恒,所以在/etc/hosts下添加本機(jī)DNS記錄贩幻,然后用curl命令來(lái)模擬訪問(wèn)過(guò)程。
建立目錄和網(wǎng)頁(yè)文件
mkdir /usr/local/nginx/html/{domain,web,example,default}
echo "domain.com" > /usr/local/nginx/html/domain/index.html
echo "web.domain.com" > /usr/local/nginx/html/web/index.html
echo "example.com" > /usr/local/nginx/html/example/index.html
echo "default" > /usr/local/nginx/html/default/index.html
nginx的配置
# nginx.conf
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 7890;
server_name www.domain.com *.domain.com;
access_log logs/www.domain.com.access.log main;
location / {
root html/domain;
index index.html index.htm;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 7890;
server_name web.domain.com;
location / {
root html/web;
index index.html index.htm;
}
}
server {
listen 7890;
server_name www.example.com;
location / {
root html/example;
index index.html index.htm;
}
}
server {
listen 7890 default_server;
location / {
root html/default;
index index.html index.htm;
}
}
}
重啟nginx兼贸,/usr/local/nginx/sbin/nginx -s reload
段直,然后在/etc/hosts
添加以下測(cè)試記錄
# /etc/hosts
# test nginx
127.0.0.1 web.domain.com
127.0.0.1 www.domain.com
127.0.0.1 test.domain.com
127.0.0.1 www.example.com
127.0.0.1 hello.example.com
127.0.0.1 world.example.com
使用curl來(lái)測(cè)試:
root@iZ28xhlm5vhZ:~# curl web.domain.com:7890
web.domain.com
root@iZ28xhlm5vhZ:~# curl www.domain.com:7890
domain.com
root@iZ28xhlm5vhZ:~# curl test.domain.com:7890
domain.com
root@iZ28xhlm5vhZ:~# curl www.example.com:7890
example.com
root@iZ28xhlm5vhZ:~# curl hello.example.com:7890
default
root@iZ28xhlm5vhZ:~# curl world.example.com:7890
default