MySQL复制、MySQL-proxy MariaDB, PerconaDB MySQL HA Web: Nginx, LNMP, Memcached, haproxy, tomcat, varnish HTTP服务器, 反向代理:reverse proxy http mail C10k 单进程:阻塞 多进程:每个进程响应一个请求 进程量大,进程切换次数过多 每个进程的地址空间是独立,很多空间是重复的数据,所以内存使用效率较低 线程:thread, Light Weight Process, LWP Linux支持多少种类型的线程库?如何切换线程库? 每个线程响应一个请求: 线程依然切换:切换较之进程属于轻量级 同一个进程的线程可以共享进程的诸多资源,比如打开的文件; 对内存的需求较之进程略有下降; 快速银的时会带来线程抖动 10K 多进程多线程 多线程:N个请求 一个线程响应多个请求 多路IO, IO复用; httpd: MPM prefork: 一个进程响应一个请求,1024 worker: 一个线程响应一个请求,多进程,一个进程生成多个线程 event:基于事件驱动, keepalived + ningx: 实现高可用 corosync + ningx IO: 模型 nginx: web服务器 反向代理 web mail 模块化 Tengine varnish, squid nginx: cache(disk) httpd: cache(disk, memory) memcached nginx热部署:平滑升级 referer nginx: server{}: 虚拟主机 location{}: location /URI/ { root "/web/htdocs"; } httpd: URI路径: http://www.magedu.com/ location [ = | ~ | ~* | ^~ ] uri { ... } location URI {}: 对当前路径及子路径下的所有对象都生效; location = URI {}: 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效; location ~ URI {}: location ~* URI {}: 模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~*不区分字符大小写; location ^~ URI {}: 不使用正则表达式 /a/3.gif htpasswd: 第二次不能使用-c选项; 已经接受连接的个数,已经处理的连接的个数,已经处理的请求的个数; reading: nginx正在读取其首部请求的个数; writing: nginx正在读取其主体的请求的个数、正处理着其请求内容的请求的个数或者正在向其客户发送响应的个数; waiting: 长连接模式的保持的连接个数 LEMP: PHP+MySQL FastCGI: php-fpm: 127.0.0.1:9000 编译:php LEMP: RHEL 6.4 + Nginx-1.4.1 + MySQL-5.6.10 + php-5.4.13 + Xcache-3 Nginx: 李叔同:有智而性缓者斯大智,有才而气和者定为大才; 王阳明:知行合一 Nginx: IO模型: 阻塞 非阻塞 同步: 异步: 同步阻塞: 异步阻塞:IO复用 异步阻塞:event-driven 异步非阻塞:aio Nginx: mmap event-driven 一个进程响应多个请求:单线程进程 aio LEMP: Enginx (FastCGI) + php-fpm location ~* \.php$ { fastcgi_pass 127.0.0.1:9000; } fastcgi Nginx配置文件 main, worker_process error_log user group events { } 事件驱动相关 httpd { } 关于http相关的配置 server { } 虚拟主机 location URI { directive ; } URI访问属性; 上下文 server { listen 80; server_name www.magedu.com; location / { 后端服务器; } } 反向代理: proxy_pass location [op] URI { http://172.16.100.11/; } ~ ~* ^~ = location @name location /forum/ { proxy_pass http://172.16.100.11:8080/bbs/; } http://www.magedu.com/forum/ --> http://172.16.100.11:8080/bbs/; location ~* ^/forum { proxy_pass http://172.16.100.11:8080/bbs; } http://www.magedu.com/forum/ --> http://172.16.100.11:8080/forum/ proxy_set_header X-Real-IP $remote_addr GET、POST、HEAD、PUT、TRACE、OPTIONS、CONNECTION、DELETE nginx: round-robin ip_hash least_conn Nginx, cache: 共享内存:存储键和缓存对象元数据 磁盘空间:存储数据 proxy_cache_path: 不能定义在server{}上下文中; 缓存目录:子目录级别 proxy_cache_path /nginx/cache/first levels=1:2:1 keys_zone=first:20m max_size=1G; cache_manager: LRU WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。 另外常用的三种缓存: open_log_cache:日志缓存 open_file_cache: fastcgi_cache: 而nginx的limit限制也基于共享内存实现。 nginx: gzip upstream phpsrvs { server server } upstream imgsrvs { server server } upstream staticfilesrvs { server server } location / { root /web/htdocs; index index.php index.html; } location ~* \.php$ { fastcgi_pass http://phpsrvs; } location ~* "\.(jpg|jpeg|gif|png)$" { proxy_pass http://imgsrvs; } rewirte: URL重写模块 if (condition) { } 测试: 双目测试: ~, !~ =, != ~*, !~* if ($request_method="POST") { } if ($request_uri ~* "/forum") { } 单目测试: referer: location /images/ { rewrite http://172.16.100.19/images/ } 支持正则表达式: location / { root html; index index.html; rewrite "^/bbs/(.*)/images/(.*)\.jpg$" http://www.magedu.com/bbs/$2/images/$1.jpg last; } http://www.magedu.com/bbs/a/images/b.jpg --> http://www.magedu.com/bbs/b/images/a.jpg --> http://www.magedu.com/bbs/a/images/b.jpg http://www.magedu.com/bbs/index.html --> http://www.magedu.com/forum/index.html last: 本次重写完成之后,重启下一轮检查; break: 本次重写完成之后,直接执行后续操作; httpwatch key: value name: Jerry http web object: memcached http://www.magedu.com/index.html xml: get set memcached: 缓存服务器,但本身无法决定缓存任何数据 一半依赖于客户端,一半依赖于服务器 set key 5 60 hello lazy: 惰性, LRU,最近最少使用 内存缓存服务器: 48bytes 1MB index.html: 10K test.jpg: 34K buddy system: 伙伴系统 避免内存外碎片 slab allocator: slab分配器 避免内存内碎片 memcached: 不通信分布式缓存服务器 event-driven: libevent memcached -p: TCP port, 11211 -m #: 以MB为单位,指定memcached可用的最大内存 Reverse Proxy: http, pop3/imap4 web server Nginx: 反向代理 URI, 代理后端某服务器; proxy_pass, rewrite upstream:将一组后端计算机定义集群 rr ip_hash least_conn:最少连接 lc, wlc proxy: /bbs /php /images worker_process : CPU: 1 IO: 1.5 亲缘性: syslog: facility.priority http://www.magedu.com/admin.php?a=3&b=4 listen web bind *:80 rhel 6.4 RPM 反向代理:缓存 HTTP/1.1 HTTP/1.1 <-- HTTP/1.0 cache web object: browser: 缓存机制 本地: Expire: 2013-05-21 15:55:31 Cache-Control: max-age=600 index.html: 14:55:59 14:55:59, 0000011: Etag: a9873db If-None-Match 条件判断: vcl_recv vcl_pass vcl_hash vcl_hit vcl_deliver vcl_miss vcl_pass vcl_fetch vcl_deliver vcl_recv vcl_hash vcl_fetch vcl_deliver vcl_hit vcl_miss vcl_pass 泛域名解析 www.magedu.com/admin.php magedu.com/admin.php wwww.magedu.com/admin.php *.magedu.com/ vcl_recv: req.backend server.ip client.ip req.request :请求方法 req.url req.proto req.http.
: req.restarts:保存了重启的次数; 向后端主机发请求时: beresp.request: beresp.url beresp.proto beresp.http.header beresp.ttl: 缓存时长 从后端主机取回内容后: obj.status: obj.cacheable: 表示返回内容是否可以缓存,200,203,301,302,404,410 obj.valid: 是否为有效的http应答; obj.response" obj.ttl: 可缓存时长 对客户端应答: resp.status: 返回给客户端的状态码 resp.proto resp.http.
: 返回给客户响应报文的首部 resp.response: 返回的状态信息 varnish, harproxy, httpd, nginx, mysql, php, tomcat, keepalived, corosync/heartbeat, shell haproxy+keepalivedy varnish: 4w1h: Cache: HTTP/1.1 Expire Cache-Control: public, private, no-cache, no-store, max-age, s-maxage Etag Last-Modified If-Modified-Since Vary If-None-Match Expire: Cache-Control: max-age= cache_hit rate: 、30/100 cache missing reate: 缓存未命中率 Expire: 10 Cache-Control: max-age=600s 10s: 600: Last-Modified: 304, Not Modified 200, Vary: auth, private, cookie a.jpg: 1: a.jpg 2: if (req.request ~ "\.(jpeg)$") { unset } varnish: vcl_recv vcl_hash vcl_hit vcl_deliver vcl_miss vcl_fetch vcl_pass vcl_pipe vcl_error tomcat: PHP: 开发语言:脚本语言 运行环境:解释执行 Zend Engine: Opcode Xcache, APC, eAccelerator MVC: data: 数据 bussiness:业务 presentation:展示 smarty web: C/C++: CPU, OS 移植困难 维护成本高 高速 驱动 C/C++ C:面向过程 C++:面向对象 C:API (Application Programming Interface) OS, System Call: API: Windows, API Linux, API POSIX: Portable Operating System Linux, API, (compiling:Linux, running: Windows) .dll .so ABI: Application Binary Interface oak: 橡树,智能 java: 包含四个独立却又彼此相关的技术: Java程序设计语言 Java API Java Class文件格式 JVM: Java Virtual Machine Once for all 一次编译,到处运行: Write once, Run anywhere bytecode: 字节码 .java --> .class (bytecode) JVM的实现方式: 1、一次性解释器,解释字节码并执行; 2、即时编译器(just-in-time complier) 依赖于更多内存缓存解释后的结果 3、自适应编译器 缓存20%左右代码,提高80%左右的速度; Java设计语言:Sun Java API: JVM: Hotspot JVM JRE: Java 运行时环境 运行 JDK:Java 开发环境 开发(编译)+运行 JVM: OpenJDK 开发+运行 JAVA API类库 第三方类库 JDK=Java+API+JVM,是用于实现Java程序开发的最小环境。 JRE=JVM+java SE API JAVA应用领域的不同,JAVA可分为三类: JAVA SE:Standard Edtion, J2SE JAVA EE: Enterprise Edition, J2EE JAVA ME: Mobile Edtion, J2ME 1995年,JAVA 1.0面世, James Gosling, Green Project applet: 小程序 动态网站: CGI: Common Gateway Interface CGI: 协议 HTML Servlet: CGI JSP: Java Server Page <%language="java"> SSH: Structs, Spring, Hebernate JSP --> Servlet Jasper applet, servlet, jsp JSP: .jsp --> .java -->(JVM) .class JDK: javac, .java --> .class CGI, Servlet, .java Web Servlet Container: Servlet容器 Web Container: Web容器 线程私有内存区: 程序计数器 java虚拟机栈 线程共享内存区: 方法区 堆:java自动内存回收,GC(Garbage Collector) 垃圾回收算法: 1、标记-清除 2、复制 二分之一 3、标记-整理 垃圾回收器: Serial ParNew Parallel Scavenge Serial Old Parallel Old CMS: Concurrent Mark Sweep 特点:并发收集、低停顿 缺点:无法浮动垃圾、由于基于标记-清除会产生碎片 G1 JVM: 100, 4: 4线程 SUN: JRE JDK Open: OpenJDK JDK 1.6 update 32 JDK 1.7 update 9 jdk-1.6.32 安装: rpm 通用二进制格式, .bin 源码 JVM: java java配置参数: -XX:+