很早就听说nginx性能高,并且并发能力强,是能够和Apache竞争的服务器,而且代码时开源的,所以很想学习一下,可是一直没有时间,
刚好这段比较空闲,就来学习一下。
很多关于nginx的资料都是基于linux平台的,所以就在win7下安装了图形界面的Ubuntu,可是用惯了windowx安装软件就点一下那个exe,
悲催的linux下没有exe的软件,做什么事情都是在黑框框中写命令,这对于没用学过linux命令的人来说真是一件难事。
nginx的安装
首先下载nginx的安装包,因为我买了《nginx深入详解(陶辉)》这本书,他是基于1.014版本的,所以我就下载了1.015版本,下载
之后解压:
tar -zxf nginx安装包的路径,比如我放在桌面上tmp文件夹:/home/smtl/桌面/tmp/nginx-1.0.15.tar.gz
tar
-zxf
/home/smtl/桌面/tmp/nginx-1.0.15.tar.gz
然后下载nginx依赖的三个库zlib-1.2.8 OpenSSLpcre
用tar命令解压(我的这三个安装包也都放在/home/smtl/桌面/tmp)
然后在cd /home/smtl/桌面/tmp/nginx-1.0.15
进入解压后的nginx文件,然后用下面的命令安装:
./configure --prefix=/home/smtl/桌面/textNx --with-http_ssl_module --with-pcre=/home/smtl/桌面/tmp/pcre-8.34 --with-zlib=/home/smtl/桌面/tmp/zlib-1.2.8 --with-openssl=/home/smtl/桌面/tmp/openssl-1.0.1c make make install
--prefinx=/home/smtl/桌面/textNx : nginx安装目录,如果不加这句的默认路径就是:/usr/local/nginx
--with-http_ssl_module: 安装ssl模块
--with-pcre=/home/smtl/桌面/tmp/pcre-8.34 : pcre文件路径
--with-zlib=/home/smtl/桌面/tmp/zlib-1.2.8 : zlib文件路径
--with-openssl=/home/smtl/桌面/tmp/openssl-1.0.1c: openssl文件路径
启动nginx
确保系统的
80 端口没被其他程序占用:netstat -ano|grep
sudo /home/smtl/桌面/textNx/nginx
打开浏览器输入127.0.0.1,如果浏览器出现
Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
常用的配置
配置例子
usr nobody
worker_processes 2;
error_log /var/log/nginx/error.log error;
#pid logs/nginx.pid
events {
use epoll;
worker_connections 50000;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr [$time_local] "$request"‘
‘$status $bytes_event "$http_referer"‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
access_log logs/access.log main buffer=32k;
}
2.3.1调试进程和定位问题的配置项
1)是否以守护进程方式运行Nginx
语法: daemon on|off;
默认: daemon on;
守护进程是在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程就不会被任何终端所产生的信息打断。
2)是否以master/worker方式工作
语法:master_process on|off
默认: master_process on;
如果master_process off就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求的。
3)error日志的设置
语法: error_log /path/file level;
默认: error_log logs/error/log error;
error日志使定位Nginx问题的最佳工具,我们可以根据自己的需求来设置error日志的路径和级别。
/path/file 的取值:
默认logs/error.log,
/dev/null 这样就不会输出任何日志
还可以使stderr 这样日志会输出到标准错误文件中。
error日志的级别:debug、info、notices、warn、error、crit、alert、emerg,从左到右级别依次增大。
4) 是否处理几个特殊的调试点
语法:debug_points [stop|abort]
debug会在调试点处stop,
abort会在调试点处产生一个coredump文件
5)仅对指定的客户端输出debug级别的日志
语法:debug_connection[IP|CIDR]
这个配置项实际上属于事件类配置,它必须放在events中才有效,例如:
events {
debug_connection 10.224.66.14;
debug_connection 10.224.47.0/24;
}
6)限制coredump核心存储文件的大小
语法:worker_rlimit_core size;
7)指定coredump文件生成目录
语法:working_directory path;
worker进程的工作目录。这个配置的唯一用途就是设置coredump文件所在的目录,协助定位问题。因此,需确保worker进程有权限写入文件。
2.3.2 正常运行的配置项
1)定义环境变量
语法:env VAR|VAR=VALUE
这个配置可以让用户直接设置系统上的环境变量。env TESTPATH=/tmp/;
2)嵌入其他配置文件
语法:include/path/file;
3) pid文件路径
语法:pid path/file;
默认:pid logs/nginx.pid;
4)Nginx worker进程运行的用户及用户组
语法:user username [groupname]
默认:user noday noday
注意用户名与组名相同
5)指定Nginx worker进程可以打开的最大句柄描述符的个数
语法:work_rlimit_nofile limit;
6)限制每个用户发往Nginx的信号队列的大小。
语法:worker_rlimit_sigpending limit;
2.3.3优化性能的配置项
1)Nginx worker进程的个数
语法: worker_processes number;
默认: worker_processes 1;
2) 绑定worker进程到指定的CPU,避免多个worker抢占同一个CPU内核
语法:worker_cpu_affinity cpumask [cpumask]
例如:
worker_processes 4
worker_cpu_affinity 1000 0100 0010 0001
3)SSL硬件加速
语法:ssl_engine device
Openssl 提供的命令查看SSL硬件加速设备:
openssl engine -t
4)系统条用gettimeofday的执行斌率
语法:timer_resolution t
5)Nginx 进程优先级设置
语法:worker_priority nice
默认:worker_priority 0
2.3.4事件类配置项
1)是否打开accept锁
语法:accept_mutex [on|off]
默认:accept_mutex on;
实现所有worker进程处理的客户端请求数尽量接近。
2)使用accept锁后真正建立链接之间的延迟时间
语法:accept_mutex_delay Nms;
默认:accept_mutex_dalay 500ms;
3) lock文件的路径
语法:lock_file path/file
默认:lock_file logs/nginx.lock;
4) 批量建立新链接
语法: multi_accept [on|off]
默认: multi_accept off
5) 选择事件模型
语法:use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport]
默认:Nginx会自动使用最合适的事件模型。
6)每个worker的最大的连接数
语法: worker_connections number;
静态web服务器
2.4.1虚拟主机与请求的分发
1)监听端口
语法:listen address:port [default_server| [backlog=num|revbuf=size|sndbuf=size | accept_filter=filter|deferred|bind|inv6only=[on|off]|ssl] ]
默认:listen 80;
配置块: server
listen 127.0.0.1:8000;
listen 8000;
listen *:8000;
listen localhost:8000
2)主机名称
语法:server_name name [...];
默认:server_name "";
配置块: server
server_name后可以跟多个主机名称,如:
server_name www.testweb.com download.testweb.com;
3)server_names_hash_bucket_size
语法:server_names_hash_bucket_size size
默认:server_names_hash_bucket_size 32|64|128;
配置块:http、server、location
4)server_names_hash_max_size
语法:server_names_hash_max_size size
默认:server_names_hash_max_size 512;
配置块:http、server、location
5)重定向主机名称的处理
语法:server_names_in_redirect on|off;
默认:server_names_in_redirect on;
配置块:http、server、location
该配置需要配合server_name使用。在on打开使,表示重定向请求时回使用server_name里配置的第一个主机名代替原先请求中的Host头部;而使用off关闭时,表示在重定向请求时,会使用请求本身的Host头部。
6)location
语法:location[=|~|~*|@]/urI/{...}
配置块:server
A = 表示把URI作为字符串,以便与参数中的uri做完全匹配。例如:
location = / {
#只有当用户请求是/时,才会使用该location下的配置
}
B ~ 表示匹配URI时字母大小写敏感的
C ~* 表示匹配URI时忽略字母大小写问题
D ^~ 表示匹配URI时只需要其前半部分与URI参数匹配。例如:
location ^~/images/{
#以/image/开始的请求都会匹配上
}
E @ 表示仅用于Nginx服务内部请求之间的重定向问题,带有@的location不直接处理用户的请求。
F 当然,在uri参数中是可以用正则表达式的,例如:
locatioin ~* \.(gif|jpg|jpeg)$ {
#匹配以gif、jpg、jpeg结尾的请求
}
G 如果相处里不匹配所有的请求时则。。。就用“/”这个location处理。例如:
locatioin / {
# / 可以匹配所有的请求
}