一:下载并编译nginx
wget http://nginx.org/download/nginx-1.1.0.tar.gz
./configure
make &&make install
-
configure
命令可以检测操作系统已经安装的软件,参数解析,生成中间目录,以及根据各种参数s生成一些C源码文件和Makefile文件。 -
make
根据configure生成的Makefile文件编译工程,生成最终的目标文件,二进制文件。 -
make install
根据configure执行时参数将nginx部署到指定的安装目录,包括相关目录的建立和二进制文件,配置文件的复制。
二:configure详解
可以使用./configure --help
命令查看configure包含的参数,configure相关参数在另一篇文章configure参数详解中介绍。
三 nginx命令行命令
-
/usr/local/nginx/sbin/nginx -c xxx/nginx/conf
加载指定位置的nginx配置文件 -
/usr/local/nginx/sbin/nginx -t
测试配置是否有错 -
/usr/local/nginx/sbin/nginx -V
测试编译阶段的参数 -
/usr/local/nginx/sbin/nginx -s stop
快速停止服务(和kill效果相同) -
/usr/local/nginx/sbin/nginx -s quit
优雅的停止服务(处理完所有请求后才退出) -
/usr/local/nginx/sbin/nginx -s reload
重新加载配置文件并生效(nginx会先测试配置文件是否有误,如果全部正确,则优雅的关闭nginx后重启)
一:nginx的配置
使用nginx的模块,仅仅需要修改配置文件即可,所以下面简述nginx的配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events { #events是一个配置项名,配置项名必须是nginx的某个想要处理的,否则报错
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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
配置项中使用变量
- 有些模块支持变量,要注意这种变量不是全局通用的
- 在使用configure编译nginx的时候虽然已经把模块编译到nginx中,但是是否使用该模块取决于nginx.conf文件中有没有配置使用该模块
nginx基本配置
- nginx在运行的时候,必须加载几个核心模块和一个事件类模块,所有其他模块运行都依赖于这些模块,这些配置可以分为四类:
- 用于调试定位问题的配置项
- 正常运行的必备配置项
- 优化性能配置项
- 事件类型配置项
- 有些配置项虽然没有显示配置,但是在有自己默认值,需要注意这种情况。
- 用于调试定位的配置项
daemon off/on是否以守护进程运行
master_worker off/on 是否以master/worker方式运行
errorlog path/file level 日志配置
debug_point [stop|abort] 是否处理几个特殊调试点(nginx在一些关键逻辑设置了调试点,当nginx执行到这些调试点的时候会发出SITSTOP信号)
debug_connection[IP|CIDR] 仅对指定用户客户端输出DEBUG级别的日志(使用该配置前需要在执行configure时加入--with-debug参数)
worker_rlimit_core_size 1024M; 执行core文件大小
working_directory path ; 执行core文件存储目录
- 正常运行配置项
env var=temp ;定义环境变量
include pathfile ;嵌入其他配置文件
pid path/file ;pid文件路径
user username[groupname] ; nginx worker进程运行的用户及用户组
worker_rlimit_nofile ;指定nginx每个worker进程可打开的最大文件描述符数
worker_rlimit_sigpending limit; 限制信号队列
- 优化性能配置项
worker_process 1(默认); nginx worker进程的个数(最好和CPU相同)
worker_cpu_affinity cpumask ;绑定worker到指定CPU
ssl_engine device ;ssl硬件加速
worker_priority nice; worker优先级
- 事件类配置项
accept_mutex off/on ;是否打开accept锁(负载均衡锁)
lock_file path/file ;
worker_connection number; 每个worker建立的最大连接数
一个http静态服务器示例
配置一个http服务器nginx提供了很多配置项,包括,虚拟主机的分发,文件路径的定义,内存磁盘资源分配,网络设置,MIME类型设置,对客户请求的限制,文件操作优化,对客户端请求的特殊处理。
下面分别说明:
- nginx可以通过server块来定义虚拟主机,每个server块表示一台虚拟主机,这样使得不同的域名可以被转发到相同IP的服务器上面。
listen address:port ;监听地址和端口
#listen指令还有很多其余参数,用时可查询官方文档
server_name "xxx";后面可以跟多个主机
//server_name,在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由哪个server块来处理这个请求。
server_name_hash_bucket_size 10M;设置每个桶占用内存的大小
location [正则] ;location会根据用户请求的uri来匹配正则中表达式,可以匹配就选择location块中的配置来处理用户请求。
- 文件路径定义
1. root xxx ; //以root方式设置资源路径,表示资源根目录
示例:
location /download/{
root webroot ;
}
若请求URI为/download/index/test.html,对应于服务器地址则为 webroot/download/index/test.html
2. alias path ; 设置资源路径的第二种方式,只能用在location块中
示例:
location /conf/{
alias /www/conf/ ;
}
请求为/conf/test.html使用alias得到的服务器路径是/www/conf/test.html
使用root则可以如下:
location /conf/{
root /www/ ;
}注:实际上alias会将匹配到的匹配到的location中的这一段字符串丢弃。
3. index index.html设置首页 ,访问/(根目录)的时候会访问该资源,可以跟多个,按照顺序访问。
4. err_page 404 error.html 根据http状态吗重定向到设置 的页面(当前为error.html)
- 内存和资源分配
1.connection_pool_size 256;
nginx对每个成功建立TCP连接的socket预先分配一个内存池,
2. request_pool_size 4k ;
nginx开始处理请求时,会为每个请求分配一个内存池
上述两个配置可以减少内核对小块内存的分配次数
- 网络相关参数
1. reset_timeout_connection off;用户连接超时后是否直接向用户发送reset并释放连接(不等待time_out超时结束),该配置可以避免服务器产生很多的TIME_WAIT类的连接。
2. keep_alive_timeout 75 ;keep_alive 超时时间
3. keepalive_request 100 ;一个keepalive允许承载的最大请求数
- MIME配置
- 对客户端请求的限制
1. limit_except_methos {} 限制用户请求的方法
2. limit rate 0 ; 对客户端限制每s请求的字节数,0为不限速。
- 文件操作的优化
1. sendfile off; sendfile系统调用 (提高发送文件的效率)
2. AIO off ; 是否启用内核级别的异步IO(与sendfile互斥)
。。。
- 对客户端请求的特殊处理
resolve address ; 设置DNS域名解析的服务器地址
9 ngx_http_core_module提供的变量
HTTP模块为用户提供了丰富的变量,例如arg_parameter这样的变量可以取到url请求中参数为parameter的变量值。
参数名称 注释
$arg_PARAMETER HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site取得www.ttlsa.com这个值.
$args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.
$binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E
$body_bytes_sent 表示在向客户端发送的http响应中,包体部分的字节数
$content_length 表示客户端请求头部中的Content-Length 字段
$content_type 表示客户端请求头部中的Content-Type 字段
$cookie_COOKIE 表示在客户端请求头部中的cookie 字段
$document_root 表示当前请求所使用的root 配置项的值
$uri 表示当前请求的URI,不带任何参数
$document_uri 与$uri 含义相同
$request_uri 表示客户端发来的原始请求URI,带完整的参数。$uri和$document_uri未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI.
$host 表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。$host 是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。
$hostname 表示 Nginx所在机器的名称,与 gethostbyname调用返回的值相同
$http_HEADER 表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表
$sent_http_HEADER 表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值
$is_args 表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串
$limit_rate 表示当前连接的限速是多少,0表示无限速
$nginx_version 表示当前 Nginx的版本号
$query_string 请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变
$remote_addr 表示客户端的地址
$remote_port 表示客户端连接使用的端口
$remote_user 表示使用 Auth Basic Module时定义的用户名
$request_filename 表示用户请求中的 URI经过 root或 alias转换后的文件路径
$request_body 表示 HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义
$request_body_file 表示 HTTP请求中的包体存储的临时文件名
$request_completion 当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。
$request_method 表示 HTTP请求的方法名,如 GET、PUT、POST等
$scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https
$server_addr 表示服务器地址
$server_name 表示服务器名称
$server_port 表示服务器端口
$server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0
使用http proxy module配置一个反向代理服务器
nginx作为反向代理服务器:当nginx接受一个HTTP请求的时候,先把用户的请求完整的接收到所在服务器硬盘或内存中,然后再向上游服务器发起连接。当从上游服务器接收到内容时,则不缓存,而是边接受边转发到客户端。
- 负载均衡和反向代理基本配置
upstream 定义一个负载均衡集群,便于反向代理中proxy_pass使用。
proxy_pass 将当前请求反向代理到URL指定的服务器,URL,可以是IP加端口或upstream块。
proxy_method 表示反向代理的请求方法
示例:
upstream server01 //表示一个负载均衡上游服务器集群
{
server 10.0.1.50:8080; //指定集群中一台上游服务器
server 10.0.1.51:8080;
}
server
{
listen 80;
server_name www.linuxidc.com;
location / {
proxy_pass server01;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
}
}
网友评论