Nginx
F5硬件:也是做负载均衡的
Nginx:作用:
- 静态文件处理
- 动态负载均衡
Nginx作为一个Web服务器,将静态文件由自己处理,动态文件转发为其他的服务器进行处理(Tomcat),这样就提高了效率。
Nginx不能处理动态文件的。
Nginx常见的问题:http://bbs.csdn.net/topics/390276707
下载配置Nginx
去官网上下载Nginx,我选择的是稳定版:http://nginx.org/en/download.html
安装Nginx需要的依赖项:
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
执行configure
要设置安装的路径是啥:make[1]: Leaving directory `/opt/nginx-1.10.3',出现这样的命令可以不用管他
./configure --prefix=/opt/nginx
我安装到了root下了。
执行make&make install
make && make install
启动报错的情况:
/usr/local/nginx/sbin/nginx 启动nginx报错,信息如下: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) ….. 使用ps -ef|grep nginx,并未发现有nginx进程,有可能被其他进程占用,这时可以采用如下方式处理: 1. 查看80端口占用 netstat -ntpl 2. 杀掉占用80端口的进程 kill -9 $pid
最终可以启动:
Nginx简单配置
内容来自于:http://www.jikexueyuan.com/course/1876_1.html?ss=1
还有相关配置详解的博文:http://blog.csdn.net/xmtblog/article/details/42295181
Nginx拦截请求的配置:
# server 表示一个虚拟主机,一台服务器可配置多个虚拟主机 server { # 监听端口 listen 80; # 识别的域名 server_name localhost; # 一个关键设置,与url参数乱码问题有关 charset utf-8; #access_log logs/host.access.log main; #location表达式: #syntax: location [=|~|~*|^~|@] /uri/ { … } #分为两种匹配模式,普通字符串匹配,正则匹配 #无开头引导字符或以=开头表示普通字符串匹配 #以~或~* 开头表示正则匹配,~*表示不区分大小写 #多个location时匹配规则 #总体是先普通后正则原则,只识别URI部分,例如请求为/test/1/abc.do?arg=xxx #1. 先查找是否有=开头的精确匹配,即location = /test/1/abc.do {...} #2. 再查找普通匹配,以 最大前缀 为规则,如有以下两个location # location /test/ {...} # location /test/1/ {...} # 则匹配后一项 #3. 匹配到一个普通格式后,搜索并未结束,而是暂存当前结果,并继续再搜索正则模式 #4. 在所有正则模式location中找到第一个匹配项后,以此匹配项为最终结果 # 所以正则匹配项匹配规则受定义前后顺序影响,但普通匹配不会 #5. 如果未找到正则匹配项,则以3中缓存的结果为最终结果 #6. 如果一个匹配都没有,返回404 #location =/ {...} 与 location / {...} 的差别 #前一个是精确匹配,只响应/请求,所有/xxx类请求不会以前缀匹配形式匹配到它 #而后一个正相反,所有请求必然都是以/开头,所以没有其它匹配结果时一定会执行到它 #location ^~ / {...} ^~意思是非正则,表示匹配到此模式后不再继续正则搜索 #所有如果这样配置,相当于关闭了正则匹配功能 #因为一个请求在普通匹配规则下没得到其它普通匹配结果时,最终匹配到这里 #而这个^~指令又相当于不允许正则,相当于匹配到此为止 location / { root html; index index.html index.htm; # deny all; 拒绝请求,返回403 # allow all; 允许请求 } location /test/ { deny all; } location ~ /test/.+\.jsp$ { proxy_pass http://192.168.1.62:8080; } location ~ \.jsp$ { proxy_pass http://192.168.1.61:8080; } # 定义各类错误页 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; } # @类似于变量定义 # error_page 403 http://www.jikexueyuan.com这种定义不允许,所以利用@实现 error_page 403 @page403; location @page403 { proxy_pass http://http://www.jikexueyuan.com; } }
80端口和Tomcat8080端口的问题:
http://www.oschina.net/question/922543_89331
http://blog.csdn.net/juan0728juan/article/details/53019997#
我的简单配置修改如下:
server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main; #反向代理到8080端口,而页面不显示! proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。 #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { proxy_pass http://www.zhongfucheng.site:8080/index.html; } # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 #后缀匹配 location ~* \.(css|js|html|ico)$ { root /opt/apache-tomcat-7.0.82/webapps/zhongfucheng; } #第三个规则就是通用规则,用来转发动态请求到后端应用服务器 #非静态文件请求就默认是动态请求,自己根据实际把握 #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了 location / { proxy_pass http://www.zhongfucheng.site:8080/; }
Nginx优化配置
# nginx不同于apache服务器,当进行了大量优化设置后会魔术般的明显性能提升效果 # nginx在安装完成后,大部分参数就已经是最优化了,我们需要管理的东西并不多 #user nobody; #阻塞和非阻塞网络模型: #同步阻塞模型,一请求一进(线)程,当进(线)程增加到一定程度后 #更多CPU时间浪费到切换一,性能急剧下降,所以负载率不高 #Nginx基于事件的非阻塞多路复用(epoll或kquene)模型 #一个进程在短时间内可以响应大量的请求 #建议值 <= cpu核心数量,一般高于cpu数量不会带好处,也许还有进程切换开销的负面影响 worker_processes 4; #将work process绑定到特定cpu上,避免进程在cpu间切换的开销 worker_cpu_affinity 0001 0010 0100 1000 #8内核4进程时的设置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000 # 每进程最大可打开文件描述符数量(linux上文件描述符比较广义,网络端口、设备、磁盘文件都是) # 文件描述符用完了,新的连接会被拒绝,产生502类错误 # linux最大可打开文件数可通过ulimit -n FILECNT或 /etc/security/limits.conf配置 # 理论值 系统最大数量 / 进程数。但进程间工作量并不是平均分配的,所以可以设置的大一些 worker_rlimit_nofile 655350 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { # 并发响应能力的关键配置值 # 每个进程允许的最大同时连接数,work_connectins * worker_processes = maxConnection; # 要注意maxConnections不等同于可响应的用户数量, # 因为一般一个浏览器会同时开两条连接,如果反向代理,nginx到后端服务器的连接也要占用连接数 # 所以,做静态服务器时,一般 maxClient = work_connectins * worker_processes / 2 # 做反向代理服务器时 maxClient = work_connectins * worker_processes / 4 # 这个值理论上越大越好,但最多可承受多少请求与配件和网络相关,也可最大可打开文件,最大可用sockets数量(约64K)有关 worker_connections 500; # 指明使用epoll 或 kquene (*BSD) use epoll # 备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数 } 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"'; # 关闭此项可减少IO开销,但也无法记录访问信息,不利用业务分析,一般运维情况不建议使用 access_log off # 只记录更为严重的错误日志,可减少IO压力 error_log logs/error.log crit; #access_log logs/access.log main; # 启用内核复制模式,应该保持开启达到最快IO效率 sendfile on; # 简单说,启动如下两项配置,会在数据包达到一定大小后再发送数据 # 这样会减少网络通信次数,降低阻塞概率,但也会影响响应及时性 # 比较适合于文件下载这类的大数据包通信场景 #tcp_nopush on; 在 #tcp_nodelay on|off on禁用Nagle算法 #keepalive_timeout 0; # HTTP1.1支持持久连接alive # 降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值 keepalive_timeout 30s; # 启动内容压缩,有效降低网络流量 gzip on; # 过短的内容压缩效果不佳,压缩过程还会浪费系统资源 gzip_min_length 1000; # 可选值1~9,压缩级别越高压缩率越高,但对系统性能要求越高 gzip_comp_level 4; # 压缩的内容类别 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; # 静态文件缓存 # 最大缓存数量,文件未使用存活期 open_file_cache max=655350 inactive=20s; # 验证缓存有效期时间间隔 open_file_cache_valid 30s; # 有效期内文件最少使用次数 open_file_cache_min_uses 2; 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; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} include /usr/local/nginx/conf/vhosts/*.conf; }
此部分我暂时没有进行修改!以后用到再来看把!
Tomcat优化
<?xml version='1.0' encoding='utf-8'?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- protocol 启用 nio模式,(tomcat8默认使用的是nio)(apr模式利用系统级异步io) --> <!-- minProcessors最小空闲连接线程数--> <!-- maxProcessors最大连接线程数--> <!-- acceptCount允许的最大连接数,应大于等于maxProcessors--> <!-- enableLookups 如果为true,requst.getRemoteHost会执行DNS查找,反向解析ip对应域名或主机名--> <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443 maxThreads=“500” minSpareThreads=“100” maxSpareThreads=“200” acceptCount="200" enableLookups="false" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
这部分也没有用到,等需要用到的时候再回来!
配置成功
在配置完之后,我总有一个疑问,Nginx是否已经帮我们处理了静态文件???
于是我在网上找相关的问题,可没有相关的资料。。
最后我就在想:Tomcat的端口我配置的是8080,静态资源在http://zhongfucheng.site:8080,在tomcat下肯定是可以获取得到的。
如果静态资源在http://zhongfucheng.site就能够获取得到了,那么静态资源就已经被Nginx处理了!
最后在网页上看源码果然是配置成功了!