nginx编译简单安装和优化(一)
nginx编译简单安装 前提: 安装开发环境 yum groupinstall “Deveopment Tools” “Server Platform Developent” 另外,在安装nginx时,可能额外依赖pcre-devel,来实现扩展表达式,扩展URL重写,它不会自动安装 yum -y install pcre-devel 1,下载nginx包,加压 [root@www ~]# tar xf nginx-1.6.2.tar.gz [root@www ~]# cd nginx-1.6.2 在之前的文档中没有细说编辑安装选项,这次将会简单介绍 --prefix=默认安装路径 --sbin-path=PATH=主程序安装路径 --conf-path=PATH=主配置文件路径 --error-log-path=PATH=错误日志路径 -pid-path=PATH=pID文件路径 --lock-path=PATH=索文件路径 --user=普通用户 --group=组 --http-client-body-temp-path=PATH:定义临时目录路径 启用功能模块: -with-rtsig_module 禁用为功能模块: --without-poll_module 至于这些模块的介绍,请登录nginx官网查看 这里显示的启用,表示默认没启用 这里显示的禁用,表示默认启用 [root@www nginx-1.6.2]# ./configure --help --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname --lock-path=PATH set nginx.lock pathname --user=USER set non-privileged user for worker processes --group=GROUP set non-privileged group for worker processes --builddir=DIR set build directory --with-rtsig_module enable rtsig module --with-select_module enable select module 2,创建nginx普通用户 [root@www nginx-1.6.2]# groupadd -r nginx [root@www nginx-1.6.2]# useradd -g nginx -r nginx [root@www nginx-1.6.2]# id nginx uid=495(nginx) gid=492(nginx) groups=492(nginx) [root@www nginx-1.6.2]# 3,编译 为了以后的迁移和备份删除,我们手动指定安装路径 ./configure --prefix=/usr/local/nginx 安装路径 --conf-path=/etc/nginx/nginx.conf 配置文件(也可以放在安装路径下,方便迁移) --user=nginx 指定运行的普通用户 --group=nginx 指定运行的组 --error-log-path=/var/log/nginx/error.log 指明错误日志文件路径(也可以后盖配置文件) --http-log-path=/var/log/nginx/access.log 指明访问日志路径 --pid-path=/var/run/nginx/nginx.pid pid文件路径 --lock-path=/var/lock/nginx.lock 索文件路径 --with_http_ssl_module 启用ssl模块 --with_http_stub_status_module 启用状态页面 --with_http_gzip_static_module 启用压缩功能 --with-http_flv_module 启用流媒体 --with-http_mp4_module 启用MP4模块 --http-client-body-temp-path=/var/tmp/nginx/client 指明临时文件路径 *这些路径需要创建 --http-proxy-temp-path=/var/tmp/nginx/proxy proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi uwsgi [root@www nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi [root@www nginx-1.6.2]# make && make install [root@www ~]# mkdir -pv /var/tmp/nginx/{client,fastcgi,proxy,uwsgi} mkdir: created directory `/var/tmp/nginx' mkdir: created directory `/var/tmp/nginx/client' mkdir: created directory `/var/tmp/nginx/fastcgi' mkdir: created directory `/var/tmp/nginx/proxy' mkdir: created directory `/var/tmp/nginx/uwsgi' [root@www ~]# /usr/local/nginx/sbin/nginx [root@www ~]# ss -tnlp | grep :80 LISTEN 0 128 *:80 *:* users:(("nginx",4528,6),("nginx",4529,6)) [root@www ~]# 配置文件: main配置段:全局配置段 event{}: 定义event模型工作特性 http {} : 定义http协议相关的配置 配置指令:要以分号结尾,语法格式:directive value1 [value2...] 支持使用变量: 内置变量:模块会提供几建变量定义 自定义变量:set var_name value 主配置段的指令: 用于调试、定位问题 正常运行必备的配置 优化性能的配置 事件相关的配置 www.nginx.org 下载偶数,基数为开发版 在nginx-1.8后引入支持的新特性: 1,hash负载均衡方法:hash load balancing method 2,后端ssl证书校验 :backend SSL certificate 3,支持线程池 4, 代理请求的缓冲 主配置段的指令: 正常运行的必备配置: 1、user USERNAME [GROUPNAME]; 指定运行worker进程的用户和组; user nginx nginx; 2、pid /path/to/pid_file; 指定nginx守护进程的pid文件; pid /var/run/nginx/nginx.pid; 3、worker_rlimit_nofile #; 指定所有worker进程所能够打开的最大文件句柄数; 性能优化相关的配置: 1、worker_processes #; worker进程的个数;通常应该略少于CPU物理核心数;(比如是八核,设置7核,剩下一个给系统其他) 2、worker_cpu_affinity cpumask ...; 优点:提升缓存的命中率; context switch进程切换本身会产生CPU的不必要的消耗;因此尽可能发挥CPU的最大化,的把进程绑定CPU上,但是你绑定后这颗CPU仍然可以被切换,只是被绑定的进程不能再其他切换到别的CPU而已。这样,被绑定的nginx进程的缓存有效性提高。 假设服务器有4课CPU,开始设定机器上的三个CPU给NGINX,开机就说明剩下一个给内核,这样一来,内核要调度任何资源,只能在最后一个CPU上调度,做内核隔离! 隔离中断,设定的着三课CPU不处理中断也不让任何程序调度,不受内核调度。nginx绑定后霸占三个内核 三个进程起来之后,假如说每一个worker进程支持一万个并发,那三万个就很轻松了。 前提是中断和隔离操作! cpumask: 0000 0000 0000 0001 第一个CPU 0000 0010 第二个CPU 0000 0100 第三个CPU 0000 1000 第四个CPU worker_cpu_affinity 00000001 00000010 00000100; 3、timer_resolution 计时器解析度;降低此值,可减少gettimeofday()系统调用的次数; timer_resolution指:减少降低worker线程中的计时解析度,减少发起系统调用,任何一个系统中,如果系统调用很多,任何一次系统调用必然会产生软中断,产生软中断的直接结果就是模式转换,每一次的模式转换必然会消耗时间。没一个生产力非常强的经常,应该把大量的时间运行在用户空间。 比如:任何一个请求达到nginx时候,nginx响应会产生日志,日志会记录时间,一旦有请求到达,nginx响应必须获取当前系统时间,记录日志当中。获取日志时间的方式便是:gettimeofday。如果获取的日志时间解析度过大的话,就会带来结果是:1秒钟解析1千次,那也就是1秒钟发起1千次系统调用,如果设为毫秒,那便是1毫秒解析10次,时间解析度越低精度越低,时间解析度越高精度越高。当然,消耗的资源也是对称的。 4、worker_priority number; 指明worker进程的nice值;(nice=worker优先级) -20, 19 100, 139 数字越小优先级越高,优先级越高优先调用 默认情况下优先级为0 事件相关的配置: 1、accept_mutex {off|on}; master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求; 2、lock_file file; accept_mutex用到的锁文件路径; 3、use [epoll|rtsig|select|poll]; 链接处理方法 指明使用的事件模型;建议让Nginx自行选择; 4、worker_connections #; 设定单个worker进程所能够处理的最大并发连接数量; worker_connections 乘 work_processes 用户于调试、定位问题: 1、daemon {on|off}; 是否以守护进程方式运行nginx;调试时应该设置为Off; 2、master_process {on|off}; 是否以master/worker模型来运行nginx; 调试时可以设置为off; 3、error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg]; error_log 位置 级别; 若要使用debug级别,需要在编译nginx时使用了--with-debug选项; 常需要进行调整的参数 worker_processes, worker_connections, worker_cpu_affinity, worker_priority