Nginx 源码安装和简单的配置

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/

其中,

  1. conf:放置nginx相关的配置文件,最核心的是nginx.conf
  2. html:默认的网站根目录
  3. logs:日志文件目录(访问日志,错误日志,运行时的进程id cat logs/nginx.pid)
  4. 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一样配置文件引用动态链接库):

  1. 下载一个第三方库用于测试,wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz,参考链接中是2.0的版本,在我的服务器make生成的时候报错了,于是改成了最新版的2.3
  2. 解压到主目录中,tar -xzvf ngx_cache_purge-2.3.tar.gz -C ~
  3. 进入nginx源码所在的目录,我的源码放在/usr/src/nginx中,cd /usr/src/nginx
  4. 查看当前的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
  5. 在选项后添加需要添加的第三方模块选项,添加--add-module=/root/ngx_cache_purge-2.3,注意/root是我的主目录
  6. (重要的一步!)只需要make生成主程序而不安装(在此之前可以查看一下objs目录中的nginx文件的最后修改时间),make,保证没有报错(看到objs/nginx的最后修改时间已经变化)
  7. 替换启动文件,cp /usr/local/nginx/sbin;mv nginx nginx.bak;cp /usr/src/nginx-1.11.2/objs/nginx .
  8. 启动或重启nginx(命令略)

编译选项参考

配置文件解析

参考链接1
参考链接2

    # 当生成一些文件的时候,所属的用户和组
    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
        }
    }

CGI
FastCGI

在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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容