综述:Nginx 是一个高性能的 Web 和反向代理服务器, 它具有很多非常优越的特性,由俄罗斯程序员开发,在国内大型互联网公司中有大范围应用
架构图
1.nginx介绍
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
2.nginx.config文件配置
#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 {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 7080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 后端opsdata数据接口
location /ops-data/ {
proxy_pass http://10.203.13.4:8030/ops-data/;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST';
}
location /html/ {
root F:\eos-ops-core-01381347\ops-weber\webolder\WebRoot;
index index.html index.htm;
}
location / {
root html;
index index.html index.htm;
# 请求的后端接口,下方的是本地的后端服务
proxy_pass http://10.203.13.4:8030/;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST';
}
location = /login.html {
root html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.nginx 反向代理
location 中的路径在匹配的时候,是由精确到粗的匹配的,上述demo 配置中的三种情况的分析,该配置主要是解决了两个系统之间的跨域的问题;除了jsonp,cors等两种解决跨域问题;这也是一个值得推荐的方法;
4.nginx服务器的常见的作用?
- ngixn静态资源服务器
- 解决跨域的问题
- 负载均衡
- 请求过滤(类似于请求代理)
- 配置gzip
5.nginx最大并发连接数优化
nginx一般能转发的并发数为1万-10万,这个必须要进行nginx配置优化和操作系统层面的优化;
user www www;
worker_processes 8; #设置值和CPU核心数一致
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
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';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
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;
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;
#limit_zone crawler $binary_remote_addr 10m;
#下面是server虚拟主机的配置
server
{
listen 7091;#监听端口
server_name localhost;#域名
location /opsdata/ {
# 直接返回json内容
#default_type application/json;
#return 200 '{"status":"success","result":"nginx json"}';
root /usr/local/webserver/nginx/html/data;
# try_files $uri $uri/$arg_first/$arg_second/$arg_third/$arg_fourth/$arg_fifth;
try_files $uri $uri/$arg_first/$arg_second/$arg_third/$arg_fourth/$arg_fifth/1.json;
#try_files $uri /opsdata/1/1/1/1/1/1.json;
}
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}
}
操作系统层面要优化的内容有:
主要是修改一些参数,百度即可,不然无法发出例如10000+的请求;
6.lvs介绍
lvs在现在的Linux系统中,已经自带了,可以直接使用。
首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序;
参考链接:http://www.ha97.com/5646.html
软件方面:
nginx,LVS(全称呼是 是淘宝的一个博士开发的项目),Haproxy等
硬件方面(价格十分昂贵,一般都需要20万以上):
F5,深信服,Array等;
7.在Linux服务器上生成千万级测试文件的方法
使用java代码实现上述功能,要运行java的项目需要先将项目打包成war包或者jar包,打包成war包需要将war包部署到tomcat服务器上才能运行。而打包成jar包可以直接使用java命令执行。在linux系统中运行jar包主要有以下四种方式。
- java -jar XXX.jar
这是最基本的jar包执行方式,但是当我们用ctrl+c中断或者关闭窗口时,程序也会中断执行。
- java -jar XXX.jar &
&代表在后台运行,使用ctrl+c不会中断程序的运行,但是关闭窗口会中断程序的运行。
- nohup java -jar XXX.jar &
使用这种方式运行的程序日志会输出到当前目录下的nohup.out文件,使用ctrl+c中断或者关闭窗口都不会中断程序的执行。
- nohup java -jar XXX.jar >temp.out &
>temp.out的意思是将日志输出重定向到temp.out文件,使用ctrl+c中断或者关闭窗口都不会中断程序的执行。
8.查看当前正在执行的java程序命令
ps -ef | grep java
9.跟老男孩学Linux运维中学习的知识点记录
- Linux的基础知识
- centos的安装和客户端操作软件的使用
- 企业级NFS网络文件共享服务,这相当于我们的nas服务是一个意思
- keepalived高可用集群应用实践,起初是专门为lvs负载均衡软件设计的,用来管理并监控lvs集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理lvs软件外。还可以作为其他服务(如nginx,Haproxy,Mysql等)的高可用解决方案软件。
- 企业级Memcached服务应用实践,是一个数据缓存服务,相当于Redis。但是两者之间还是存在不同之处的
- 企业级监控Nagios实践,这是一个可以监控服务器,数据库的系统软件,如果发生宕机事件可以通过邮件和短信的方式及时报告给系统运维人员
10.关于运维人员的两大职责的思考
- 保证数据的安全性
- 保证服务器的7*24小时不宕机
11.使用node搭建静态文件服务器也是能实现nginx在此处的作用的,效果并没有比nginx好多少
node的三大特点:
- 单线程
- 非阻塞I/O
- 事件驱动
12.lua编程在nginx中的应用?
如果涉及到在nginx中进行复杂的逻辑处理,就需要使用lua脚本来进行解决了;
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
Lua 特性
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 其它特性:
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
Lua 应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
13.什么是openResty?和lua脚本之间的区别?和nginx之间有什么关系?
在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高;如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀;目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行;而目前市面上用的非常成熟的扩展是由章亦春将Lua和Nginx粘合的ngx_lua模块,并且将Nginx核心、LuaJIT、ngx_lua模块、许多有用的Lua库和常用的第三方Nginx模块组合在一起成为OpenResty,这样开发人员就可以安装OpenResty,使用Lua编写脚本,然后部署到Nginx Web容器中运行。从而非常轻松就能开发出高性能的Web服务。
14.nginx心跳检测
upstream springboot {
server 10.3.73.223:8080 max_fails=2 fail_timeout=30s; //最大和服务端通讯失败次数,心跳检测时间
server 10.3.73.223:8090 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
location /test {
proxy_pass http://springboot;
}
}
在30s内(fail_timeout,默认值为10s),与服务端通讯失败2次(max_fails,默认值为1,设置为0则认为服务端一直可用),则认为服务器不可用。
参考文章: https://jinnianshilongnian.iteye.com/blog/2280928