nginx三大功能: 反向代理和负载均衡 web服务器 mail服务器 好处: 并发支持更好 >10w 热部署 nginx的安装: 1. 安装pcre、openssl、zlib 解压软件包并清除之前的编译: tar -zxvf pcre-8.40.tar.gz sudo make distclean 安装gcc套件: 事先更新apt软件源(可以增加aliyun的软件源,vim /etc/apt/sources.list) sudo apt-get install build-essential gcc --version 编译检查: ./configure 编译 make 安装 sudo make install ... 2. 安装nginx tar ./configure make sudo make install Configuration summary + using system PCRE library + OpenSSL library is not used + md5: using system crypto library + sha1: using system crypto library + using system zlib library nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp" nginx的启动与关闭: sudo /usr/local/nginx/sbin/nginx sudo /usr/local/nginx/sbin/nginx -s reload sudo /usr/local/nginx/sbin/nginx -s stop nginx的进程模型: ubuntu@nginxweb:/usr/local/nginx$ ps -ef |grep nginx root 59569 1 0 00:36 ? 00:00:00 nginx: master process sbin/nginx nobody 59570 59569 0 00:36 ? 00:00:00 nginx: worker process ubuntu 59576 1403 0 00:39 pts/0 00:00:00 grep --color=auto nginx | worker 0 | <----3--------| worker 0<----2--- client-------1------|--------1--------> master <---------signal----0---|change nginx.conf | listen 80 | worker 0 热部署的原理: 配置文件修改,master向woker发送signal,如果当前的worker正在处理客户端请求,则让worker先把请求处理完成,再将其进程重新启动以加载配置文件; 如果当前的woker处于空闲状态,则master立即重启woker进程以重新加载配置文件。 一般生产环境中worker的数目与nginx服务器的cpu的核数相同。 nginx的 master-worker 设计的妙处: 1. 每个worker进程是相互独立的,不需要枷锁,省去了锁竞争的资源开销; 2. woker之间的独立性保证了nginx服务器的安全性; nginx的master-worker 与 tomcat的master-worker 机制的区别: 1. tomcat的worker采用的是线程,而nginx的woker采用的是进程; 2. tomcat的worker客户端之间的通信是阻塞的,而nginx的worker与客户端之间的通信是异步非阻塞的。 [注] 异步非阻塞(linux nginx worker epoll 事件驱动机制,客户端来数据我才处理这个客户端的请求,否则不处理, 一个cpu worker能够处理6-8w并发) nginx的事件处理机制: woker抢占互斥锁accept_mutex,谁抢到互斥锁,谁就能与客户端通信。 这也是并发抢占资源额通常处理方式。 nginx配置示例: 最简单的配置-nginx将请求指向静态资源 ----------------------------------------------------------------------------------------------------------- user ubuntu; worker_processes 1; events { use epoll; #use kqueue; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /home/ubuntu/test; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #error_page 404 /404.html; } } 下面的nginx.conf简单的实现nginx在前端做反向代理服务器的例子,处理js、png等静态文件,jsp等动态请求转发到其它服务器tomcat: ----------------------------------------------------------------------------------------------------------- user www www; worker_processes 2; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; events { #惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。 accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 2048; #最大连接数,默认为1024 } http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain #自定义格式 # $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; # $remote_user :用来记录客户端用户名称 # time_local : 用来记录访问时间与时区 # $request : 用来记录请求的url与http协议 # $status : 用来记录请求状态;成功是200 # $body_bytes_s ent :记录发送给客户端文件主体内容大小 # $http_referer :用来记录从那个页面链接访问过来的 # $http_user_agent :记录客户端浏览器的相关信息 #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; #允许sendfile方式传输文件,可以在http块,server块,location块。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 # tcp_nopush on; keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。 # gzip压缩功能设置 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 6; gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; # http_proxy 设置 client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 75; proxy_send_timeout 75; proxy_read_timeout 75; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /usr/local/nginx/proxy_temp 1 2; # 设定负载均衡后台服务器列表 upstream backend { #ip_hash; server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ; server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ; } # 很重要的虚拟主机配置 server { listen 80; #监听端口 server_name itoatest.example.com; #监听地址 root /apps/oaapp; charset utf-8; access_log logs/host.access.log main; #对 / 所有做负载均衡+反向代理 location / { root /apps/oaapp; #根目录 index index.jsp index.html index.htm; #设置默认页 proxy_pass http://backend; #请求转向 backend 定义的服务器列表 deny 127.0.0.1; #拒绝的ip allow 172.18.5.54; #允许的ip proxy_redirect off; # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } #静态文件,nginx自己处理,不去backend请求tomcat location ~* /download/ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 root /apps/oa/fs; } location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /apps/oaapp; expires 7d; } location /nginx_status { stub_status on; access_log off; allow 192.168.10.0/24; deny all; } location ~ ^/(WEB-INF)/ { deny all; } #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; } } ## 其它虚拟主机,server 指令开始 } [注] 正则匹配示例 ===== location = / { # 只匹配 / 查询。 } location / { # 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。 } location ^~ /images/ { # 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。 } location ~*.(gif|jpg|jpeg)$ { # 匹配任何已 gif、jpg 或 jpeg 结尾的请求。 } location ~*.(gif|jpg|swf)$ { valid_referers none blocked start.igrow.cn sta.igrow.cn; if ($invalid_referer) { #防盗链 rewrite ^/ http://$host/logo.png; } }