Nginx 源码安装和简单的配置
Nginx是一款开放源代码的高性能HTTP服务器和反向代理服务器。Nginx以高性能、高可用、丰富的功能模块、简单明了的配置文档以及低资源占用而著称,采用罪行的网络I/O模型,支持高达50000个并发连接。
写此篇笔记的时候,最新版是1.11.2 (http://nginx.org/download/nginx-1.11.2.tar.gz
),nginx最新版下载链接见官网
安装示例(这里安装在/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
# 没有错误出现的话,就可以进入nginx安装目录(/usr/local/nginx)配置。
成功安装后,进入/usr/local/nginx
,可以看到4个目录:
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相关的配置文件,最核心的是nginx.conf
- html:默认的网站根目录
- logs:日志文件目录(访问日志,错误日志,运行时的进程id
cat logs/nginx.pid
) - sbin:主程序(nginx)目录
一些常用的命令(可以写脚本简化管理):
1、启动: /usr/local/nginx/sbin/nginx
2、关闭: /usr/local/nginx/sbin/nginx -s stop
3、重启: /usr/local/nginx/sbin/nginx -s reload
4、指定(另外的)配置文件并启动(如果已经启动则报端口占用的错误): /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/new.conf
5、查看pid: cat /usr/local/nginx/logs/nginx.pid,可以用于kill等操作
6、查看安装时候的参数: /usr/local/nginx/sbin/nginx -V
参考链接--如何在安装成功的nginx中添加未编译的安装模块(nginx添加模块需要重新编译nginx,而不是像Apache一样配置文件引用动态链接库):
- 下载一个第三方库用于测试,
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
,参考链接中是2.0的版本,在我的服务器make生成的时候报错了,于是改成了最新版的2.3 - 解压到主目录中,
tar -xzvf ngx_cache_purge-2.3.tar.gz -C ~
- 进入nginx源码所在的目录,我的源码放在/usr/src/nginx中,
cd /usr/src/nginx
- 查看当前的nginx安装使用了哪一些选项,用于重新编译,
/usr/local/nginx/sbin/nginx -V
,我的选项是--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
- 在选项后添加需要添加的第三方模块选项,添加
--add-module=/root/ngx_cache_purge-2.3
,注意/root是我的主目录 - (重要的一步!)只需要make生成主程序而不安装(在此之前可以查看一下objs目录中的nginx文件的最后修改时间),
make
,保证没有报错(看到objs/nginx的最后修改时间已经变化) - 替换启动文件,
cp /usr/local/nginx/sbin;mv nginx nginx.bak;cp /usr/src/nginx-1.11.2/objs/nginx .
- 启动或重启nginx(命令略)
配置文件解析
# 当生成一些文件的时候,所属的用户和组
user www-data;
# 启动子进程(worker)数,可以通过`ps aux | grep nginx` 查看,一般设置成CPU核数。
worker_processer 1;
# 全局错误日志,这里的“当前目录”为/usr/local/nginx
error_log logs/error.log; # 默认
# 保存PID的log
pid logs/nginx.pid; # 默认
# 工作模式和连接数上限
events{
# epoll是多路复用IO中的一种方式,仅用于linux2.6以上的内核,可以大大提高nginx的性能
use epoll;
# 单个worker process进程的最大并发连接数,受系统文件句柄限制,即`ulimit -a`中open files项
worker_connections 65535;
}
# 设定http服务器
http{
# 设定mime类型,mime.types为“文件类型定义”文件,“当前目录”为conf/
include mime.types;
# 默认文件类型
default_type application/octet-stream;
# 默认编码
# charset utf-8;
# 反向代理配置,可以打开proxy.conf看看
# include proxy.conf;
# fastcgi配置,可以打开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"';
# 全局访问日志,使用以上定义的main格式
access_log logs/access.log main;
# sendfile指令指定nginx是否调用sendfile函数[零拷贝方式](http://baike.baidu.com/view/704944.htm)来输出文件。这是一个提高通信效率但是降低数据传输速率的函数,只有在用来进行下载等应用磁盘IO重负载的应用中设置为off
sendfile on;
# 服务器的响应头部信息产生独立的数据包发送,即一个响应头信息=>一个包
tcp_nopush on;
# 保持连接的超时时间
keepalive_timeout 65;
# 页面压缩后传输更节省流量
gzip on;
# 防止网络阻塞
tcp_nodelay on;
# 服务器名字的hash表大小
# server_names_hash_bucket_size 128;
# 上传文件大小限制
# client_header_buffer_size 32k;
# 设定请求缓存
# large_client_header_buffers 4 64k;
# client_max_body_size 8m;
# 开启限制IP连接数的时候需要使用
# limit_zone crawler $binary_remote_addr 10m;
# 包含每个server的配置
# include /usr/local/nginx/myconf/*.conf;
# server可以include进来,也可以直接写在后面,用于定义虚拟主机。最重要的是字段是server_name和root
server{
# 服务器监听端口
listen 7890;
# 访问域名
server_name www.example.com
# 编码格式,如果网页编码与此设置不同,则将被自动转码,覆盖全局的编码。。
# charset koi8-r;
# 设置虚拟主机的访问日志
# access_log logs/www.example.com.access.log main;
# 对URL进行匹配,访问server_name的时候进入这里
location / {
# 网页根目录,“当前目录”在nginx的安装目录,即/usr/local/nginx,可以用绝对路径或相对路径,以下的html是相对安装目录
root html;
# 默认的首页文件(有先后顺序),访问www.example.com则寻找root下的index.html返回,如果找不到,就找index.htm
index index.html index.htm;
}
# 设置错误代码对应的错误页面
# error_page 404 /404.html
# error_page 500 502 503 504 /50x.html
# 略去配置代理和HTTPS Server
}
}
在Ubuntu上的简单的一个例子
首先在默认的网站根目录下建立虚拟主机的目录和文件,然后修改conf/nginx.conf配置并重启nginx,由于不能用DNS域名解析来指向server_name,所以在/etc/hosts下添加本机DNS记录,然后用curl命令来模拟访问过程。
建立目录和网页文件
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
添加以下测试记录
# /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来测试:
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