ngixn
nginx是一个高性能http服务器和反向代理web服务器,淘宝还在基础上开发了tengine。
nginx是一个master进程与多个work进程进行工作,master进程负责管理work进行,work进程负责接收具体客户请求进行工作,worker_processes是设置work进程数量,一般work进程数量是根据cpu数量来设置,可以绑定具体cpu工作。worker_connectons来设置每个进程支持的最大连接数,在操作系统中我们要设置limit得系统打开文件最大数。
下面是nginx源码的目录结构:
.
├── auto 自动检测系统环境以及编译相关的脚本
│ ├── cc 关于编译器相关的编译选项的检测脚本
│ ├── lib nginx编译所需要的一些库的检测脚本
│ ├── os 与平台相关的一些系统参数与系统调用相关的检测
│ └── types 与数据类型相关的一些辅助脚本
├── conf 存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib 存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man nginx的man手册
└── src 存放nginx的源代码
├── core nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
├── event 对系统事件处理机制的封装,以及定时器的实现相关代码
│ └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
├── http nginx作为http服务器相关的代码
│ └── modules 包含http的各种功能模块
├── mail nginx作为邮件代理服务器相关的代码
├── misc 一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
└── os 主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口
nginx.conf中的配置信息,根据其逻辑上的意义,对它们进行了分类,也就是分成了多个作用域,或者称之为配置指令上下文。不同的作用域含有一个或者多个配置项。
当前nginx支持的几个指令上下文:
main: nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
http: 与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。
server: http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。
location: http服务中,某些特定的URL对应的一系列配置项。
nginx模块
upstream模块是一个代理模块,upstream上游的意思,本地没有的程序代码可以到其他机器上访问。
upstream backend {
server localhost:3100;
server localhost:3101;
}
server {
proxy_buffering on;
proxy_buffer_size 1k;
proxy_buffers 24 4k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 2048m;
listen 8080;
location / {
# 忽略掉所有原始请求头
proxy_pass_request_headers off;
# 修改host头
proxy_set_header Host $host;
# 此处显示server头给客户端 要不客户端显示的是代理服务器的server
proxy_pass_header Server;
proxy_pass http://backend;
}
}
ip_hash是负载均衡模式,把同一个IP地址得客户端分配到同一台服务器处理,可以解决session不共享问题。
如果不加ip_hash,则用rr模型就是轮转
这里还可以添加第三方模块进行改变其他的负载均衡模式
开启gzip压缩
以下代码需要http{}字段内
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
level可以是1--9,数字越大压缩等级越高,响应越慢,cpu计算越高。
代理php需要fastcgi模块,代理Java用proxy
fastcgi相关参数
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
server {
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html;
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
proxy相关参数
proxy_buffering on;
proxy_buffer_size 1k;
proxy_buffers 24 4k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 2048m;
proxy_temp_file_write_size 32k;
location / {
proxy_pass http://example.com;
}
日志相关
log_format main '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$request_time"' '"$http_user_agent" $HTTP_X_Forwarded_For';
access_log /var/log/nginx/web2.access.log main;
其他相关
use epoll; #事件驱动模型,events上下文,select|poll|kqueue|epoll|resig|/dev/poll|eventport,一般我们都用epoll模式,异步非堵塞
charset gb2312; #支持utf-8,gbk等
deny 127.0.0.1;
allow 172.18.5.54; #权限location上下文
keepalive_timeout 65; #长连接http,server,location上下文
ssl配置
listen 443;
server_name baidu.com;
ssl on;
root /var/www/baidu.com;
index index.html index.htm;
ssl_certificate cert/214292799730473.pem;
ssl_certificate_key cert/214292799730473.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
安装nginx
nginx一般我们都编译源码进行安装
需要make和c环境yum install -y gcc gcc-c++ make
如果用到rewrite重写和gzip压错我们一般还需要安装pcre,zlibyum install -y prce-devel zlib openssl-devel
下载安装包wget http://nginx.org/download/nginx-1.6.2.tar.gz
解压tar zxvf nginx-1.6.2.tar.gz
进入安装包目录cd nginx-1.6.2
编译安装./configure make make install
查看nginx版本/usr/local/nginx/sbin/nginx -v
检查配置文件/usr/local/nginx/sbin/nginx -t
启动nginx/usr/local/nginx/sbin/nginx
重载nginx配置文件/usr/local/nginx/sbin/nginx -s reload
nginx添加模块
nginx比较好的功能是动态添加模块,不用停止服务
下载要添加的模块git clone https://github.com/agentzh/echo-nginx-module
查看已编译参数/usr/local/nginx/sbin/nginx -V
重新编译./configure --add-module=/root/echo-nginx-module make
备份原二进制文件,拷贝新二进制文件到sbin目录
cp /usr/local/nginx/sbin/{nginx,nginx_bak}
cp /root/nginx-1.6/objs/nginx /usr/local/nginx/sbin/nginx
检查及平滑升级
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload