首页 文章 精选 留言 我的

精选列表

搜索[单体架构],共10000篇文章
优秀的个人博客,低调大师

Nginx学习笔记(一) Nginx架构

Nginx全程是什么?Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。 daemon守护线程 nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。 当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。 master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。 worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。 worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。 惊群现象 每个worker进程都是从master进程fork过来。在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。 相对于线程,采用进程的优点 进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。 编程上更加容易。 多线程的问题 而多线程在多并发情况下,线程的内存占用大,线程上下文切换造成CPU大量的开销。想想apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。 异步非阻塞 异步的概念和同步相对的,也就是不是事件之间不是同时发生的。 非阻塞的概念是和阻塞对应的,阻塞是事件按顺序执行,每一事件都要等待上一事件的完成,而非阻塞是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。但是,多次询问也会带来额外的开销。 总的来说,Nginx采用异步非阻塞的好处在于: 不需要创建线程,每个请求只占用少量的内存 没有上下文切换,事件处理非常轻量 淘宝tengine团队说测试结果是“24G内存机器上,处理并发请求可达200万”。 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/3141469.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

JPDA 架构研究2 - JVMTI代理

引入: 我们先从JVMTI讲起。JVMTI的主要作用是提供一组接口来检测VM的状态和控制VM中运行的JAVA程序。JVMTI是个双向接口: JVMTI的客户端叫Agent,它会在VM发生变化时通过事件机制被通知到变化。 JVMTI的服务端是许多函数,它们会和VM实际打交道并把结果告知Agent. 实践: 我们这里先来看下Agent. Agent的方法定义在哪里呢?它们定义在$JAVA_HOME/include/jvmti.h文件中。 1 2 3 4 5 JNIEXPORTjintJNICALL Agent_OnLoad(JavaVM*vm, char *options, void *reserved); JNIEXPORT void JNICAL。 Agent_OnUnload(JavaVM*vm); Agent_OnLoad方法: 当代理被VM加载时,会由VM调用Agent_Onload方法。此时VM有如下能力: (1)VM的System Property已经被设置完毕。 (2)VM的Capabilities已经被设置完毕。 (3)任何字节码都没被执行。 (4)任何类都没有被加载。 (5)任何对象都没有被创建。 Agent_OnLoad实现过程中,最重要的事情之一就是调用GetEnv方法来获取JVMTI环境的指针。 1 jintGetEnv(JavaVM*vm, void **env,jintversion); 这样,这个代理就可以知道被代理的环境的全部信息。 Agent_OnUnload方法: 当代理被VM卸载时,会由VM调用Agent_OnUnload方法。一般发生在终止VM的时候,它一般可以用来清理在Agent_OnLoad阶段创建的资源。 因为我们在远程调试时候启动JVM时候加了代理参数: java -agentlib:<agentLibName> ,而agentLibName我们配置的是jdwp, 所以它就对应上jdwp.dll. 也就是远程调试时候自动会在启动target VM时候启用jdwp这个代理库. 当明白了代理的作用后,我们来找其的实现。在Sun的JDK中,我们找到了jdwp.dll (Linux环境则是jdwp.so) . 它位于 $JAVA_HOME/jre/bin目录下。我们用exeScope软件打开查看内容: 显然,它是Oracle的Sun的JDK提供的Agent ,它提供了2个方法,一个是_Agent_OnLoad(),一个是_Agent_OnUnload() 和我们设想的一致。 总结: 从上过程我们似乎可以总结一些结论: 1. Agent 是在虚拟机启动之时加载的,这个加载处于虚拟机初始化的早期.在这个时间点上: 所有的 Java 类都未被初始化;所有的对象实例都未被创建; 因而,没有任何 Java 代码被执行; (从这点上说,最明显的好处就是它能完成早期调试中用System.out.println()无法解决的问题,因为System.out.println()前提是代码行所在的类已经被初始化过了) 2.但在这个时候,我们已经可以: 操作 JVMTI 的 Capability 参数; 使用系统参数; 动态库被加载之后,虚拟机会先寻找一个 Agent 入口函数. 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587548,如需转载请自行联系原作者

优秀的个人博客,低调大师

JPDA 架构研究17 - JDI概览

引入: 前面用了很多篇幅来讨论JVMTI和JDWP部分,现在终于来看最靠近用户端部分了,JDI。 分析: a. JDI的基础知识 和JVMTI和JDWP不一样的是,JDI提供了一组接口,这些接口是纯JAVA编写的。他们主要是给开发环境IDE用的,虽然调试器的实现可以直接利用JDWP或者JVMTI,但是多了这一层则可以从用户的代码级别来定义要发送的请求和获取的信息。 本质上,Eclipse的调试器与目标VM之间的双向通信如下: 调试器将用户的操作转化为调试命令,命令通过链接被发送到前端运行目标程序的虚拟机上;然后,目标虚拟机根据接受的命令做出相应的操作,将调试的结果发回给后端的调试器;最后,调试器可视化数据信息反馈给用户。 JDI接口定义在$JAVA_HOME/lib/tools.jar中,从宏观上看,它分为5个大包。 包名 描述 com.sun.jdi 这是JDI的核心包,它提供了镜像机制将目标虚拟机上的所有数据、类型、域、方法、事件、状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成 Mirror 对象 com.sun.jdi.connect 该包用于定义JDI到目标虚拟机的连接 com.sun.jdi.connect.spi 该包用于定义开发TransportService(也就是前面我在JDWP层讨论很深的传输器服务)所需要的必要的类和接口。 com.sun.jdi.event 该包定义了JDI事件和事件处理 com.sun.jdi.request 该包用于发送JDI事件然后在一定条件下发送。 b.JDI的具体实现 以Eclipse为例: org.eclipse.jdt.debug 是 JDI 的一个完整实现,而org.eclipse.jdt.debug.ui 是 Eclipse 调试工具界面的实现。从包名上看,我们大体上把JDI 分成三个部分: (1)数据模块。它负责调试器(Debugger)和目标虚拟机上(Target VM)的数据建模。 (2)链接模块。它建立调试器(Debugger)与目标虚拟机(Target VM)的沟通渠道。 (3)事件请求与处理模块。它提供调试器(Debugger)与目标虚拟机(VM)之间的交互方式。 我们会在接下来的几篇文章中从Eclipse的代码级别来分析这些模块。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1587958,如需转载请自行联系原作者

优秀的个人博客,低调大师

Nginx+Django+Uwsgi架构部署

随着IT不断发展,用户对网站的体验也越来越高,做为一名Linux运维攻城师,就得学习更多知识,网络、系统、硬件、开发等等知识。 尤其是近期自动化运维的不断发展,更多的基础运维工程师开始不断的升华自己,提升自己,学习更多开发知识来满足企业的发展。目前自动化开发运维主要集中在python django、php开发,今天我们一起来探讨主流WEB服务器Nginx如何来部署Django,直接进入主题: 一、Django环境部署 官网下载django版本,目前最新版为1.7版本,https://www.djangoproject.com/ 然后解压安装,我这里安装完后,新建的app主目录为:/root/django/django/bin/command 1 2 3 4 5 [root@Linux_wugk_SAcommand] #pwd / root / django / django / bin / command [root@Linux_wugk_SAcommand] #ls commandmanage.py [root@Linux_wugk_SAcommand] # 二、Uwsgi安装部署 下载uwsgi安装包:wgethttp://projects.unbit.it/downloads/uwsgi-2.0.6.tar.gz 解压安装:tar xzfuwsgi-2.0.6.tar.gz ;cd uwsgi-2.0.6/;python setup.py install 即可。 安装完毕后,在/root/django/django/bin/command目录(与manage.py同级目录)新建如下文件:vi django_wsgi.py 1 2 3 4 5 6 7 8 9 #!/usr/bin/envpython #coding:utf-8 import os import sys reload (sys) sys.setdefaultencoding( 'utf8' ) os.environ.setdefault( "DJANGO_SETTINGS_MODULE" , "command.settings" ) from django.core.handlers.wsgiimportWSGIHandler application = WSGIHandler() 然后新建uwsgi配置文件,内容如下:vi uwsgi_socket.xml 1 2 3 4 5 6 7 <uwsgi> <socket> 127.0 . 0.1 : 199 < / socket> <chdir> / root / django / django / bin / command< / chdir> <module>django_wsgi< / module> <processes> 4 < / processes> <daemonize>uwsgi.log< / daemonize> < / uwsgi> 注* chdir目录写当前目录,即/root/django/django/bin/command 三、Nginx部署配置 Nginx安装大家都非常熟悉,这里直接上Server段配置代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 server{ listen 80 ; server_namelocalhost; indexindex.phpindex.html; location / { includeuwsgi_params; uwsgi_pass 127.0 . 0.1 : 199 ; uwsgi_paramUWSGI_CHDIR / root / django / django / bin / command; uwsgi_paramUWSGI_SCRIPTdjango_wsgi; access_log / usr / local / nginx / logs / access.log; } location / static{ root / root / django / django / bin / command / command; } } 四、部署测试 分别启动uwsgi和nginx即可,然后通过浏览器直接访问Nginx 80端口即可。 启动命令: uwsgi -x uwsgi_socket.xml /usr/local/nginx/sbin/nginx 截图测试如下: 本文转自 wgkgood 51CTO博客,原文链接:http://blog.51cto.com/wgkgood/1555300

优秀的个人博客,低调大师

LAMP架构(PHP的安装解析)

PHP官网www.php.net 当前主流版本为5.6/7.1 一,下载php包: wgethttp://cn2.php.net/distributions/php-****.tar.gz 二,解压php包: tar zxf php-****.tar.gz 进入php文件中 cd php-**** 三,开始编译: ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.4/bin/apxs (apxs2是apache的工具,把拓展的模块放到apache的modules中,直接写到配置文件) --with-config-file-path=/usr/local/php/etc (指定配置文件所在路径,php.ini) --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config (三种不同的mysql的驱动,指定库) --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif 编译的过程中会出现很多问题,大部分都是安装问题,一个一个解决就好 我们最后想要的php5在apache的模块中 [root@localhost local]# du -sh apache2.4/modules/libphp5.so 37Mapache2.4/modules/libphp5.so php加载的模块都是静态的 用/usr/local/php/bin/php -m 命令查看 php是做为httpd的拓展模块存在的。 /usr/local/apache2.4/conf/http.conf 是apache的配置文件,在里面搜索/php5.so 会发现有一行loadmodule,就是ap2x工具加上的 四、php中mysql,mysqli,mysqlnd,pdo到底是什么 MYSQL 也叫 Original MySQL,PHP4版本的MYSQL扩展,从PHP5起已经被废弃,并从PHP7开始已经被移除。 MYSQLI 叫做 “MySQL增强扩展”。 MYSQLND MYSQL NATIVE DIRVER 叫做MYSQL “官方驱动”或者更加直接点的叫做“原生驱动” PDO PHP Data Objects PHP数据对象,是PHP应用中的一个数据库抽象层规范。 一,什么是API? 一个应用程序接口(Application Programming Interface的缩写),定义了类,方法,函数,变量等等一切 你的应用程序中为了完成特定任务而需要调用的内容。在PHP应用程序需要和数据库进行交互的时候所需要的API 通常是通过PHP扩展暴露出来(给终端PHP程序员调用)。mysql和mysqli提供了这样的API. 二,什么是驱动? 驱动是一段设计用来于一种特定类型的数据库服务器进行交互的软件代码。驱动可能会调用一些库,比如MySQL客户端库或者MySQL Native驱动库。 这些库实现了用于和MySQL数据库服务器进行交互的底层协议。在PHP拓展的角度看,MYSQL和MYSQLI还是比较上层的拓展,依赖更底层的库去连接和访问数据库,上文所说的MYSQLND就是所说的底层数据库驱动。 从应用的层面上看,我们通过PHP 的MYSQL或者MYSQLi扩展提供的API去操作数据库。 从底层来看,MYSQLND提供了底层和数据库交互的支持(可以简单理解为和MySQL server进行网络协议交互)。 而PDO,则提供了一个统一的API接口,使得你的PHP应用不去关心具体要连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器。比如MYSQL,SQLITE任何数据库都行。 即从大部分功能上看,PDO提供的API接口和MYSQLI提供的接口对于普通的增删改查效果是一致的。 五、拓展: 查看Nginx、apache、MySQL和PHP的编译参数: http://ask.apelearn.com/question/1295 本文转自 小新锐 51CTO博客,原文链接:http://blog.51cto.com/13407306/2051882,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册