Nginx源码安装

1.1 准备源码包

  1. pcre
http://www.pcre.org/
  • zlib
    http://www.zlib.net/
    
  • openssl
    http://www.openssl.org/
    
  • echo-nginx-module
    https://github.com/openresty/echo-nginx-module/tags
    

该模块主要用于方便开发人员调试,建议安装该模块,可便于调试

* ngx_devel_kit

https://github.com/simpl/ngx_devel_kit

* set-misc-nginx-module

https://github.com/openresty/set-misc-nginx-module
该模块主要用于decode uri, 依赖ngx_devel_kit模块

* luajit

http://luajit.org/

* lua-nginx-module

https://github.com/chaoslawful/lua-nginx-module
该模块用于支持lua语言,有高并发自定义需求建议安装。

* nginx

http://nginx.org/


### 1.2 源码安装
1. 安装libunwind库

下载:http://download.savannah.gnu.org/releases/libunwind
解压:
tar -zxvf libunwind-1.1.tar.gz
安装:
./configure
make CFLAGS=-fPIC
sudo make CFLAGS=-fPIC install

* 安装google-perftools

下载:http://google-perftools.googlecode.com
解压:
tar -zxvf gperftools-2.1.tar.gz
安装:
./configure
make
sudo make install
配置环境:
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
sudo ldconfig

* 安装luajit(Nginx暂时只支持到Lua5.1,不需要支持Lua开发可跳过此步骤)

wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar zxf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make
make install PREFIX=/data/software/luajit

添加环境变量

export LUAJIT_LIB=/data/software/luajit/lib
export LUAJIT_INC=/data/software/luajit/include/luajit-2.0

* 解压&&进入安装目录

tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0

* 取消debug模式
**vim auto/cc/gcc**

debug

:178
CFLAGS=”$CFLAGS -g”
==>

debug

CFLAGS=”$CFLAGS -g”

* 将nginx默认日志格式改为datatime格式
**vim src/http/modules/ngx_http_log_module.c**

:222
{ ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,
ngx_http_log_time }
==>
{ ngx_string("time_local"), sizeof("1970-09-28 12:00:00 +0600") - 1,
ngx_http_log_time },
:810
return ngx_cpymem(buf, ngx_cached_http_log_time.data,
ngx_cached_http_log_time.len);
==>
return ngx_cpymem(buf, ngx_cached_err_log_time.data,
ngx_cached_err_log_time.len);

**vim src/core/ngx_times.c**

:149
(void) ngx_sprintf(p1, "%4d/%02d/%02d %02d:%02d:%02d",
tm.ngx_tm_year, tm.ngx_tm_mon,
tm.ngx_tm_mday, tm.ngx_tm_hour,
tm.ngx_tm_min, tm.ngx_tm_sec);
==>
(void) ngx_sprintf(p1, "%4d-%02d-%02d %02d:%02d:%02d",
tm.ngx_tm_year, tm.ngx_tm_mon,
tm.ngx_tm_mday, tm.ngx_tm_hour,
tm.ngx_tm_min, tm.ngx_tm_sec);

* 配置

./configure
--prefix=/data/software/nginx
--sbin-path=/data/software/nginx/sbin/nginx
--conf-path=/data/software/nginx/etc/nginx.conf
--pid-path=/data/software/nginx/tmp/nginx.pid
--error-log-path=/data/software/nginx/log/error.log
--http-log-path=/data/software/nginx/log/access.log
--user=greentea
--group=greentea
--with-http_ssl_module
--with-http_realip_module
--with-http_stub_status_module
--with-google_perftools_module
--with-pcre=/data/software/src/pcre-8.34
--with-zlib=/data/software/src/zlib-1.2.8
--with-openssl=/data/software/src/openssl-1.0.1c
--add-module=/data/software/src/echo-nginx-module-0.53
--add-module=/data/software/src/ngx_devel_kit-0.2.19
--add-module=/data/software/src/set-misc-nginx-module-0.25
--add-module=/data/software/src/lua-nginx-module-0.10.0

* 安装

make -j 8
make install

* 准备配置文件
拷贝nginx.conf至/data/software/nginx/etc下,提供参考如下:

用户

user greentea;

工作进程,根据硬件调整,一般等于cpu核数

worker_processes 8;

错误日志 日志级别

error_log log/error.log;

pid放置的位置

pid tmp/nginx.pid;

google_perftools的线程目录

google_perftools_profiles /data/greentea/tmp/tcmalloc/tcmalloc;

指定进程可以打开的最大描述符,最好与ulimit -n 的值保持一致

worker_rlimit_nofile 1048576;

events {
#使用epoll的I/O 模型
use epoll;

  #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行
  #每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
  worker_connections  65536;

}

设定http服务器,利用它的反向代理功能提供负载均衡支持

http {
#设定mime类型,类型由mime.type文件定义
include mime.types;

  default_type  application/octet-stream;

  charset  utf-8;

  log_format  main  '[$time_local] [$remote_addr] [$remote_user] [$http_x_forwarded_for] '
                   '[$request] [$status] [$request_time] [$body_bytes_sent] '
                   '[$http_referer] [$http_user_agent] [$bytes_sent] [$request_length]';

  #用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
  access_log  log/access.log  main;

  #还原用户真实IP
  set_real_ip_from 127.0.0.1;
  set_real_ip_from 10.0.0.0/8;
  set_real_ip_from 172.16.0.0/12;
  set_real_ip_from 192.168.0.0/16;
  real_ip_header X-Forwarded-For;
  real_ip_recursive on;

  #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,getconf PAGESIZE
  #client_header_buffer_size 4k;

  #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常
  #如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
  #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
  client_body_buffer_size 512k;

  # 客户端最大上传文件大小
  client_max_body_size 1000m;

  #客户端保持连接超时时间
  keepalive_timeout 60;
  #客户端请求头读取超时时间
  #client_header_timeout 10;
  #客户端请求主体读取超时时间
  #client_body_timeout 10;
  #客户端响应超时时间
  #send_timeout 10;

  #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件
  #对于普通应用,必须设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,
  #以平衡磁盘与网络IO处理速度,降低系统uptime
  sendfile        on;
  #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
  #tcp_nopush     on;
  #
  #tcp_nodelay on;

  # http://www.cnblogs.com/rmbteam/archive/2011/10/26/2225010.html
  # 是否开启gzip数据压缩
  gzip  on; #决定是否开启gzip模块
  # 设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间
  # param1:int; param2:int(k) 后面单位是k
  gzip_buffers 16 8k;
  # 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大
  # param:1-9
  gzip_comp_level 6;
  # 当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩
  # param:int
  gzip_min_length 1000;
  # 用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项,目前此项基本可以忽略
  # param: 1.0|1.1
  # gzip_http_version 1.0
  # Nginx做为反向代理的时候启用,
  gzip_proxied any;
  # 设置需要压缩的MIME类型,非设置值不进行压缩
  # param:text/html|application/x-javascript|text/css|application/xml
  gzip_types text/plain text/css text/javascript application/x-javascript application/xml application/javascript;
  gzip_vary on;
  gzip_disable "msie6";

  #后端服务器连接的超时时间_发起握手等候响应超时时间
  proxy_connect_timeout 90;
  #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
  proxy_read_timeout 180;
  #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
  proxy_send_timeout 180;
  #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头
  #默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
  proxy_buffer_size 256k;
  #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小
  #默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
  proxy_buffers 4 256k;
  ##
  #proxy_busy_buffers_size 256k;
  ##设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
  #proxy_temp_file_write_size 256k;
  ##proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
  #proxy_temp_path /data0/proxy_temp_dir;
  ##设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB
  #proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
  #表示使nginx阻止HTTP应答代码为400或者更高的应答
  #proxy_intercept_errors on;
  #nginx等待后端返回
  proxy_ignore_client_abort on;

  #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
  #inactive是指经过多长时间文件没被请求后删除缓存
  #open_file_cache max=65535 inactive=60s;
  #这个是指多长时间检查一次缓存的有效信息
  #open_file_cache_valid 80s;
  #open_file_cache指令中的inactive参数时间内文件的最少使用次数
  #如果超过这个数字,文件描述符一直是在缓存中打开的
  #如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除
  #open_file_cache_min_uses 1;

  #负载均衡组定义
  #down:暂时不参与负载均衡
  #backup:预留的备份机器,只有其它机器挂了才访问  
  #max_fails:允许的请求失败次数  
  #fail_timeout:服务请求失败后,暂停服务时间
  #upstream myservers {
  #   ip_hash;
  #   server 192.168.12.133:80;
  #   server 192.168.12.133:80 down;
  #   server 192.168.12.133:80 max_fails=3     fail_timeout=20ms;
  #}

  #fastcgi优化配置
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 512k;
  fastcgi_buffers 8 512k;
  fastcgi_busy_buffers_size 1024;
  fastcgi_temp_file_write_size 1024;

  #include /data/software/nginx/etc/city.d/citys.geo.conf;

  include /data/software/nginx/etc/vhost.d/*.conf;

}

* 启动

/data/software/nginx/sbin/nginx


### 1.3 常见问题

1. 常用命令

启动:

  /data/software/nginx/sbin/nginx

停止:

  /data/software/nginx/sbin/nginx -s stop

重新加载:

  /data/software/nginx/sbin/nginx -s reload

测试配置文件是否正确:

  /data/software/nginx/sbin/nginx -t
  /data/software/nginx/sbin/nginx -t /data/software/nginx/etc/nginx.conf
2. 添加开机启动

在/etc/init.d/中建立软连接

sudo ln -s /data/software/nginx/nginx /etc/init.d/nginx

更新rc

sudo update-rc.d -f nginx remove
sudo update-rc.d -f nginx defaults

3.  openssl编译错误
错误信息

/usr/bin/ranlib ../../libcrypto.a || echo Never mind.
make[4]: Leaving directory /data/software/src/openssl-1.0.1c/crypto/cmac' if [ -n "" ]; then \ (cd ..; make libcrypto.so.1.0.0); \ fi make[3]: Leaving directory/data/software/src/openssl-1.0.1c/crypto'
make[2]: Leaving directory /data/software/src/openssl-1.0.1c' make[1]: *** [/data/software/src/openssl-1.0.1c/.openssl/include/openssl/ssl.h] 错误 2 make[1]: Leaving directory/data/software/src/nginx-1.8.0'
make: *** [build] 错误 2

**vim auto/lib/openssl/conf**

:31
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
==>
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/libcrypto.a"

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

推荐阅读更多精彩内容