Menu
Woocommerce Menu

CentOS6上编译安装httpd2,Jenkins服务器搭建指南

0 Comment


计算机程序的怀恋逻辑 (74),思维74

本节介绍一个常用的并发容器 –
ConcurrentHashMap,它是HashMap的现身版本,与HashMap相比较,它犹如下特点:

  • 现身安全
  • 直接扶植部分原子复合操作
  • 扶持高产出、读操作完全并行、写操作扶助一定水准的相互
  • 与联合容器Collections.synchronizedMap比较,迭代不要加锁,不会抛出ConcurrentModificationException
  • 弱意气风发致性

我们分别来看下。

现身安全

我们领略,HashMap不是现身安全的,在产出更新的动静下,HashMap的链表结构恐怕产生环,现身死循环,占满CPU,咱们看个例子:

public static void unsafeConcurrentUpdate() {
    final Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < 100; i++) {
        Thread t = new Thread() {
            Random rnd = new Random();

            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    map.put(rnd.nextInt(), 1);
                }
            }
        };
        t.start();
    }
}    

运行方面包车型大巴代码,在自家的机械上,每一回都会忍俊不禁死循环,占满CPU。

怎会现身死循环呢?死循环出今后多个线程相同的时间扩大容积哈希表的时候,不是同有时候创新多个链表的时候,这种状态或然会产出更新错过,但不会死循环,具体经过相比复杂,大家就不解释了,感兴趣的读者能够参谋那篇小说,

应用Collections.synchronizedMap方法能够生成叁个同步容器,制止该难点,替换第生机勃勃行代码就可以:

final Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<Integer, Integer>());

在Java中,HashMap还或然有一个合作版本Hashtable,它与行使synchronizedMap生成的Map基本是近似的,也是在种种方法调用上加了synchronized,大家就不赘述了。

一起容器有多少个问题:

  • 各种方法都亟待一块,协理的并发度相当的低
  • 对于迭代和复合操作,需求调用方加锁,使用相比较辛劳,且便于忘记

ConcurrentHashMap未有这个标题,它后生可畏律完结了Map接口,也是依照哈希表实现的,上边的代码替换第大器晚成行就能够:

final Map<Integer, Integer> map = new ConcurrentHashMap<>();

原子复合操作

除开Map接口,ConcurrentHashMap还完结了叁个接口ConcurrentMap,接口定义了部分尺度更新操作,具体定义为:

public interface ConcurrentMap<K, V> extends Map<K, V> {
    //条件更新,如果Map中没有key,设置key为value,返回原来key对应的值,如果没有,返回null
    V putIfAbsent(K key, V value);
    //条件删除,如果Map中有key,且对应的值为value,则删除,如果删除了,返回true,否则false
    boolean remove(Object key, Object value);
    //条件替换,如果Map中有key,且对应的值为oldValue,则替换为newValue,如果替换了,返回ture,否则false
    boolean replace(K key, V oldValue, V newValue);
    //条件替换,如果Map中有key,则替换值为value,返回原来key对应的值,如果原来没有,返回null
    V replace(K key, V value);
}

借使应用同步容器,调用方必需加锁,而ConcurrentMap将它们完成为了原子操作。实际上,使用ConcurrentMap,调用方也还没法进行加锁,它从不暴露锁接口,也不使用synchronized。

高并发

ConcurrentHashMap是为高并发设计的,它是咋做的吗?具体完毕相比较复杂,我们简单介绍其思路,首要有两点:

  • 分段锁
  • 读无需锁

一同容器使用synchronized,全部办法,竞争同多少个锁,而ConcurrentHashMap接纳分段锁能力,将数据分为多少个段,而各类段有两个单独的锁,每多少个段也就是贰个独立的哈希表,分段的基于也是哈希值,无论是保存键值对照旧基于键查找,都先依照键的哈希值映射到段,再在段对应的哈希表上进行操作。

动用分段锁,可以大大进步并发度,多个段之间能够并行读写。暗许意况下,段是14个,可是,这一个数字能够经过构造方法举办设置,如下所示:

public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel)

concurrencyLevel表示估量的互动更新的线程个数,ConcurrentHashMap会将该数转换为2的板寸次幂,比方14改换为16,25改变为32。

在对各样段的数据开展读写时,ConcurrentHashMap亦非大致的使用锁进行协同,内部接收了CAS、对部分写接纳原子情势,达成比较复杂,大家就不介绍了,达成的成效是,对于写操作,须要获得锁,不可能相互,可是读操作能够,多少个读可以互相,写的还要也能够读,那使得ConcurrentHashMap的并行度远远大于同步容器。

迭代

大家在66节牵线过,使用同步容器,在迭代中要求加锁,不然只怕会抛出ConcurrentModificationException。ConcurrentHashMap没有这几个题目,在迭代器创立后,在迭代历程中,借使另贰个线程对容器实行了改善,迭代会继续,不会抛出十分。

难题是,迭代会反映其他线程的更改?依然像上节牵线的CopyOnWriteArrayList同样,反映的是创办时的别本?答案是,都不是!大家看个例证:

public class ConcurrentHashMapIteratorDemo {
    public static void test() {
        final ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
        map.put("a", "abstract");
        map.put("b", "basic");

        Thread t1 = new Thread() {
            @Override
            public void run() {
                for (Entry<String, String> entry : map.entrySet()) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    System.out.println(entry.getKey() + "," + entry.getValue());
                }
            }
        };
        t1.start();
        // 确保线程t1启动
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
        map.put("c", "call");
    }

    public static void main(String[] args) {
        test();
    }
}

t1运维后,成立迭代器,但在迭代出口每一种成分前,先睡眠1分钟,主线程运转t1后,先上床一下,确定保证t1先运营,然后给map扩张了二个成分,程序输出为:

a,abstract
b,basic
c,call

表明,迭代器反映了新式的立异,但大家将添加语句修正为:

map.put("g", "call");

您会发觉,程序输出为:

a,abstract
b,basic

那表明,迭代器未有显示最新的翻新,那是怎么回事呢?大家需求了然ConcurrentHashMap的弱意气风发致性。

弱风度翩翩致性

ConcurrentHashMap的迭代器创设后,就能依照哈希表结构遍历种种成分,但在遍历进程中,内部因素或然会发生变化,假设生成产生在已遍历过的一些,迭代器就不会展示出来,而假设生成发生在未遍历过的有个别,迭代器就能意识并展现出来,这就是弱后生可畏致性。

挨近的意况还有或者会出今后ConcurrentHashMap的另二个主意:

//批量添加m中的键值对到当前Map
public void putAll(Map<? extends K, ? extends V> m) 

该格局毫无原子操作,而是调用put方法每一个因素实行加多的,在该办法未有终结的时候,部分改进效果就能显示出来。

小结

本节介绍了ConcurrentHashMap,它是并发版的HashMap,通过分支锁和其余技能达成了高并发,帮忙原子条件更新操作,不会抛出ConcurrentModificationException,完毕了弱风姿罗曼蒂克致性。

Java中一贯不并发版的HashSet,但能够透过Collections.newSetFromMap方法基于ConcurrentHashMap创设三个。

大家领略HashMap/HashSet基于哈希,不能够对成分排序,对应的可排序的容器类是TreeMap/TreeSet,并发包中可排序的对应版本不是基于树,而是基于Skip
List(跳跃表)的,类分别是ConcurrentSkipListMap和ConcurrentSkipListSet,它们终究是怎么呢?

(与别的章节同样,本节全数代码位于
)


未完待续,查看最新篇章,敬请关注微信徒人号“老将说编制程序”(扫描下方二维码),从入门到高等,深入显出,新秀和你三只探索Java编制程序及Computer技能的庐山真面目目。用心原创,保留所有版权。

图片 1

(74),思维74
本节介绍二个常用的并发容器 –
ConcurrentHashMap,它是HashMap的面世版本,与HashMap相比较,它犹如下特点:…

 纠正Jenkins访问端口

编译apr 以及apr-util

因为httpd 是凭借与apr的,所以应该先编写翻译apr 以至apr-util,然后再安装
httpd。
小编们的源码文件寄存的路子是/usr/local/src,大家编写翻译安装的路径是 /app/apr,/app/apr-util,/app/httpd24.

# 编译 apr 
[root@localhost apr-1.6.2]# ./configure --prefix=/app/apr  

# 安装 apr 
[root@localhost apr-1.6.2]# make -j 2 && make install   

# 编译apr-util
[root@localhost apr-util-1.6.0]# ./configure --prefix=/app/apr-util --with-apr=/app/apr/    

#安装apr-util  
[root@localhost apr-util-1.6.0]# make -j 2 && make install

  docker pull jenkins/Jenkins

将应用程序加多到情形变量中

# 添加环境变量  
[root@localhost httpd-2.4.27]# echo 'PATH=/app/httpd24/bin:$PATH' > /etc/profile.d/http24.sh   

#使环境变量生效  
[root@localhost httpd-2.4.27]# . /etc/profile.d/http24.sh

图片 2

设置开辟包组和有关信任包

在起始编写翻译安装早先,供给先安装相关的支付包组甚至其余的大器晚成对依据包,那么些包有上边包车型大巴那么些。

# 安装开发包组
[root@localhost src]# yum groupinstall "Development tools"

# 安装相应的devel包
[root@localhost src]# yum install openssl-devel pcre-devel expat-devel

理当如此,如若一齐始不知晓缺失什么包的话,能够先实行编写翻译安装,然后依照错误提醒再将相当不足的包安装上,那样也是能够的。

 
  sudo sh -c ‘echo deb binary/
>/etc/apt/sources.list.d/jenkins.list’

下载解压

先是接收rpm -qi httpd翻开一下大家的系统中是或不是早已设置了httpd应用程序,以至apr相关程序,如若已经安装过的话,最佳将其除去掉。

到Apache 官网上下载最新版的httpd 2.4 程序,以至apr 和apr-util
最新版源码包 。 将源码包进行解压。

[root@localhost src]# pwd
/usr/local/src

[root@localhost src]# ls
apr-1.6.2  apr-1.6.2.tar.gz  apr-util-1.6.0  apr-util-1.6.0.tar.gz  httpd-2.4.27  httpd-2.4.27.tar.bz2

              URIEncoding=”utf-8″

编写翻译安装 httpd

编写翻译安装httpd
,能够和睦钦命要求敞开的意义列表,然后钦点程序安装的门路,大家这里钦定的设置路线依旧 /app/httpd24

# --prefix  指定程序需要安装的路径
# --enable  指定启用的模块  
# --with-apr 指定apr的路径    
# --with-apr-util  指定apr-util 的路径
[root@localhost httpd-2.4.27]# ./configure --prefix=/app/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/app/apr/ --with-apr-util=/app/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

# 安装 httpd  
[root@localhost httpd-2.4.27]# make -j 2 && make install

 

开创网站主页,并张开测量检验

# 创建网站的根目录  
[root@localhost init.d]# mkdir /app/website 

# 建立网站主页,用于测试路径    
[root@localhost init.d]# echo /app/website/index.html > /app/website/index.html

经过上述手续,基本上就可知在CentOS 6 上打响的装置和平运动作HTTP
2.4了,如若还或许有啥样疑点,能够留言一齐套路。

正文永世更新链接地址:http://www.linuxidc.com/Linux/2017-10/147350.htm

图片 3

               URIEncoding=”utf-8″

httpd 与 apr

AP牧马人(Apache portable Run-time libraries,Apache可移植运营库)
主要为上层的应用程序提供一个得以超过多操作系统平台利用的底层援救接口库。在中期的Apache版本中,应用程序自个儿必需能够管理种种实操系统平台的细节,并对准分化的平台调用分裂的管理函数。
乘势Apache的愈益开荒,Apache组织决定将那几个通用的函数独立出来并向上形成一个新的种类。那样,AP宝马7系的支出就从Apache中单独出来,Apache仅仅是选取AP中华V而已。近些日子APCR-V首要依旧由Apache使用,由于AP奥迪Q3的较好的移植性,由此有个别亟待开展移植的C程序也初始接纳APKuga,开源项目譬如用来服务器压力测量检验的Flood
loader tester,该类型不但适用于Apache,详细的情况可查看那么些连接

图片 4

只要对AP福睿斯起到了什么样效果与利益依然不亮堂的话,能够依赖地点的图来精通。其实AP智跑正是解决了应用与系统调用之间的衔接难题,制止了Linux
开拓大器晚成套应用程序,windows
开拓生龙活虎套程序。以往,有APEscort,并开放了合并的接口,只要使用满意那个接口标准就可以了,至于什么去举行系统调用,则是由AP宝马X5来得以完成。

依赖我们地点的暗指图,大家见到,httpd 2.2 的运作,是运作在 apr 1.3.9
的基础之上的。而 httd 2.4 则是运营在 apr 1.4+
之上的。而CentOS 6
私下认可的本子是 apr-1.3.9,apr-util-1.3.9,所以我们在使用yum
安装httpd的时候,日常都是httpd 2.2 的本子。
然而,要是因为实际生产,我们须要在CentOS 6 平台上安装httpd
2.4本子的话,应该如何做啊?其实也相当粗略,我们将apr
也再度编写翻译安装一下,就能够解决那一个标题。

  订正访谈端口

将劳动足够到开机运转,并展开服务

# 将服务添加到服务列表 
[root@localhost init.d]# chkconfig --add httpd24

# 将服务设置为开机启动  
[root@localhost init.d]# chkconfig httpd24 on  


# 启动服务   
[root@localhost init.d]# service httpd24 start

在开发银行服务的经过中有异常的大希望会提示以下错误
,那是一得之见未有创立网址的根目录。所以大家去创设一下。

[root@localhost init.d]# service httpd24 start
Starting httpd: AH00526: Syntax error on line 225 of /app/httpd24/conf/httpd.conf:
DocumentRoot '/app/website' is not a directory, or is not readable                                                           
                                                        [FAILED]

   打卡jenkins.xml

创建apache 默许账号

率先给httpd 创建暗中认可的连串顾客。

# /app/website 表示网站的默认路径 ,如果不指定的话,默认是/var/www/html
# 采用yum安装的方式,指定的路径就是默认路径
[root@localhost ~]# useradd -r -d  /app/website -s /sbin/nologin apache

  Debian/Ubuntu

编辑 /app/httpd24/conf/httpd.conf 改过私下认可顾客,以致主页目录

对httpd的安顿文件实行改过,根据我们休戚相关创造的客户,以致本身钦赐的网址目录,对配备文件举办相应的校正。

图片 5

图片 6

<Connector port=”8081″protocol=”HTTP/1.1″

编纂服务的启用脚本

CentOS 6
中,服务器的开发银行脚本存放于/etc/init.d/httpd。当然大家团结编辑服务的开发银行脚本有些困难,我们得以参照早前设置过的服务脚本略加更改。

将那一个文件/etc/init.d/httpd 改名为/etc/init.d/httpd24,然后改正如下内容

图片 7

图片 8

   历史版本下载路径

   图片 9

<Connector port=”8080″ protocol=”HTTP/1.1″

 
  sudo apt-get install jenkins

  钦命运转端口并运维镜像

  图片 10

        brew installjenkins

图片 11

图片 12

   注意:即便设置退步,有望是端口被挤占,查看 /var/log/jenkins/jenkins.log``,内需改正 /var/log/jenkins/jenkins.log文件的布置项—-HTTP_PORT=8080—-

Jenkins的分布式创设及布置——节点 
http://www.linuxidc.com/Linux/2015-05/116903.htm

3.macOS系统

 

   <arguments>-Xrs -Xmx256m
-Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar
“%BASE%\jenkins.war” –httpPort=8080
–webroot=”%BASE%\war”</arguments>

标签:,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图