项目需要,搭建lnmp环境。
了解到之前的openssl曝出的heartbleed漏洞,所以一直想升级到最新的openssl版本以保证安全(其实未必安全。。。强迫症吧)这次服务器是采用微软Azure 的Centos7.3系统。中间走过很多坑,每次出问题都重置操作系统实在是无奈,所以记录下这次经历,以便日后查阅。
实际上,整个过程看下来,还是要好好系统学习一下Linux 。 还有编译的原理。

环境

  1. Centos7.3 x64

  2. lnmp一键安装包oneinstack。项目官网:Oneinstack

  3. xshell + xftp + git for windows

一、升级操作系统安装包

$ yum update -y

二、升级内核到最新并开启tcp_bbr

之前在搬瓦工搭建ss,速度到晚上一直不理想,了解到加速软件,再了解到tcp_bbr 。这是个巨大的特性。实测可以使墙外访问速度提升10倍以上,具体原理可以去查查。这个特性只有升级到Linux 4.9内核之后才支持,所以惯例升级下。
要在 CentOS 上安装最新的内核版本,我们需要增加一个 ELRepo 源。首先,让我们添加 ELRepo GPG key:

$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

再添加 RHEL-6,SL-7,CentOS-7 源:

$ rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

最后,安装 kernel 4.10(目前最新内核版本)

$ yum --enablerepo=elrepo-kernel install kernel-ml

查看当前操作系统内有多少个内核

$ awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

可以看到刚才新装的4.10内核排在第一位,所以修改下系统之后启动的内核为第一个

$ grub2-set-default 0

然后修改下/etc/sysctl.conf 文件,使得一些tcp_bbr参数在重启后生效

$ echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

重启操作系统

$ reboot

重启后查看当前操作系统的内核

$ uname -a

如果是4.10内核,那么查看当前是否以启用tcp_bbr

$ lsmod | grep tcp_bbr

不出意外的话,现在已经可以看到tcp_bbr的进程了。

配置一个新用户

其实我是为了新建一个home目录,以便待会下载各种源码包。

$ useradd test

给test用户sudo的权限,以便需要的时候提权

$ vim /etc/sudoers

找到这个文件里面的 root ALL=(ALL) ALL ,在这一行下面加一行一样的

test  ALL=(ALL)   ALL

wq! 保存退出

配置ssh免密登录

此时回到test用户的家目录 /home/test ,配置下密钥,待会可以免密登陆到系统。

$ mkdir .ssh
$ cd .ssh/
$ touch authorized_keys
$ chown test:test authorized_keys
$ chmod 600 authorized_keys
$ cd ../
$ cdown -R test:test .ssh
$ chmod 700 .ssh

此时在本地电脑上使用git bash生成一个公钥密钥对

$ ssh-keygen -t rsa

然后你就可以在电脑的C盘用户目录下找到一个.ssh文件夹,里面有刚刚生成的id_rsa,id_rsa.pub文件,在xshell顶部操作栏打开xftp,把刚生成的id_rsa.pub文件上传到/home/test目录下。
此时回到xsehll,输入命令

$ cat /home/test/id_rsa.pub >> /home/test/.ssh/authorized_keys

这样就把公钥里面的文件写到了test用户的authorized_keys文件里面。刚才已经把权限都配置好了,所以按道理是可以直接xshell新建一个窗口,然后测试ssh免密登陆了(需要在xsehll的会话属性里面配置下私钥,不然xsehll不知道你要用哪个文件去登陆)
不过,我们还是需要加强一下ssh的安全性。

增强ssh的安全性

修改ssh的配置文件/etc/ssh/sshd_config

$ vim /etc/ssh/sshd_config
#找到以下几项,并按照我的修改
PermitRootLogin no         #禁止root登陆
StrictModes yes            #开启严格模式,审查刚才的600 700权限
RSAAuthentication yes      #开启私钥验证
PubkeyAuthentication yes   #开启公钥验证
AuthorizedKeysFile      .ssh/authorized_keys  #验证文件的位置
PermitEmptyPasswords no    #禁止空密码登陆
PasswordAuthentication no  #禁止密码登陆,应该是只能密钥登陆了
AllowUsers test            #允许test用户登陆ssh

好了,保存退出之后,直接重启ssh服务(最好先开其他窗口测试下能否免密登陆再做这一步,否则待会可能就连不上了)

$ systemctl restart sshd

好了,以上是一些基本步骤,做完之后进入安装正题,开始装lnmp环境。

下载oneinstack安装包

$ cd /home/test
$ wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz    #我是国外服务器所以采用这个地址
$ tar xzf oneinstack-full.tar.gz
$ cd oneinstack
$ yum -y install screen    #这个screen是个窗口,可以解决Linux命令只能一个屏幕显示,不知道怎么切换到别的窗口看其他进程,而且screen支持你睡个觉再起来看里面的进程状态。不像shell关掉之后就看不到里面发生了什么

注意事项

因为踩过坑,所以知道这个一键安装包即将给我安装的是怎样的环境。我这里主要想解决的是:

  • 想让Nginx编译最新的openssl,并且支持http2

  • 想让PHP编译最新的openssl,并且支持http2

  • 让curl编译最新的openssl,并且支持http2

一键安装包虽然都是源码编译,但是编译的时候链接的是系统默认的openssl 1.0.1e,所以需要研究一键安装包的源代码。其中研究过程就不赘述了。。有兴趣的可以自己一个文件一个文件打开看。总之这个oneinstack写的还是非常不错的。。简直把运维人员当小白了。。什么事都干好了。。

根据我的研究,整个oneinstack 需要修改以下几个文件:(点击可查看我修改后的文件,可以直接copy使用)

  1. ./options.conf

  2. ./versions.txt

  3. ./install.sh

  4. ./include/php-7.1.sh

  5. ./include/init_CentOS.sh

  6. ./include/check_sw.sh

  7. ./include/openssl.sh (这个文件其实不用改,因为用不到)

修改文件之后,在开始安装oneinstack之前,我是先手动编译安装了openssl nghttp2 curl。因为Nginx和PHP的编译参数里面会用到这些模块。

编译安装openssl 1.1.0e

$ wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz
$ tar xzf openssl-1.1.0e.tar.gz
$ cd openssl-1.1.0e
$ ./Configure linux-x86_64 shared no-ssl2 no-ssl3 no-comp enable-ec_nistp_64_gcc_128 -Wl,-rpath,/usr/local/lib64    #我是64位系统,这里我把lib库放在lib64

$ make -j 4    #4个进程进行编译,加快速度(可能)
$ make install

等待成功make install之后,到安装目录(默认是/usr/local/)

$ /usr/local/bin/openssl version
OpenSSL 1.1.0e  16 Feb 2017
 
$ ldd /usr/local/bin/openssl    #查看加载了哪些库
    linux-vdso.so.1 =>  (0x00007ffe2ffde000)
    libssl.so.1.1 => /usr/local/lib64/libssl.so.1.1 (0x00007faabe51f000)
    libcrypto.so.1.1 => /usr/local/lib64/libcrypto.so.1.1 (0x00007faabe07a000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007faabde6b000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faabdc4f000)
    libc.so.6 => /lib64/libc.so.6 (0x00007faabd88d000)
    /lib64/ld-linux-x86-64.so.2 (0x000055a7f62cf000)

替换系统旧版openssl

$ mv /usr/bin/openssl /usr/bin/openssl.bak
$ mv /usr/include/openssl /usr/include/openssl.bak
$ ln -s /usr/local/bin/openssl /usr/bin/openssl
$ ln -s /usr/local/include/openssl /usr/include/openssl
$ openssl version    #这里已经可以直接使用openssl命令了
OpenSSL 1.1.0e  16 Feb 2017

CFLAGS and CXXFLAGS

openssl已经升级完成了,接下来编译nghttp需要用到GCC编译器和G++编译器,需要设定CFLAGS 和 CXXFLAGS参数。

$ export CFLAGS="-I/usr/local/include/ -L/usr/local/lib -L/usr/local/lib64 -Wl,/usr/local/lib64 -lssl -lcrypto"
$ export CXXFLAGS="-I/usr/local/include/ -L/usr/local/lib -L/usr/local/lib64 -Wl,/usr/local/lib64 -lssl -lcrypto"

解释一下,这里面的lssl是指 libssl.so,lcryoto 是指 libcrypto.so .
因为我刚才编译openssl的时候指定的目录是/usr/local/lib64.所以这里的 -Wl,-rpath 我都指向了这个目录。
好了,现在可以编译安装nghttp2了

编译nghttp2

$ cd /home/test/oneinstack/src
$ tar xzf nghttp2-1.21.0.tar.gz
$ cd nghttp2-1.21.0
$ CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" ./configure
...
    Compiler:
      C compiler:     gcc
      CFLAGS:         -I/usr/local/include/ -L/usr/local/lib -L/usr/local/lib64 -Wl,/usr/local/lib64 -lssl -lcrypto
      LDFLAGS:        
      C++ compiler:   g++
      CXXFLAGS:       -I/usr/local/include/ -L/usr/local/lib -L/usr/local/lib64 -Wl,/usr/local/lib64 -lssl -lcrypto
...
    Libs:
      OpenSSL:        yes (CFLAGS='-I/usr/local/include' LIBS='-L/usr/local/lib64 -lssl -lcrypto')
      
$ make -j 4
$ make install
Libraries have been installed in:
   /usr/local/lib

编译cURL

$ cd /home/test/oneinstack/src
$ tar xzf curl-7.53.1.tar.gz
$ cd curl-7.53.1
$ ./configure --with-ssl=/usr/local --with-nghttp2=/usr/local
...
configure: Configured to build curl/libcurl:

  curl version:     7.51.0
  Host setup:       x86_64-pc-linux-gnu
  Install prefix:   /usr/local
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     no      (--with-zlib)
  GSS-API support:  no      (--with-gssapi)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  IPv6 support:     enabled
  Unix sockets support: enabled
  IDN support:      no      (--with-{libidn2,winidn})
  Build libcurl:    Shared=yes,Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  sspI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/ssl/certs/ca-certificates.crt
  ca cert path:     no
  ca fallback:      no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  Metalink support: no      (--with-libMetalink)
  PSL support:      no      (libpsl not found)
  HTTP2 support:    enabled (nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP

$ make -j 4
$ make install

查看curl所在位置和链接库

$ which curl
/usr/local/bin/curl

$ ldd /usr/local/bin/curl
    linux-vdso.so.1 =>  (0x00007fff4a358000)
    libssl.so.1.1 => /usr/local/lib64/libssl.so.1.1 (0x00007f6c3edfa000)
    libcrypto.so.1.1 => /usr/local/lib64/libcrypto.so.1.1 (0x00007f6c3e955000)
    libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x00007f6c3e6e9000)
    libz.so.1 => /lib64/libz.so.1 (0x00007f6c3e4c8000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6c3e106000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f6c3df02000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6c3dce6000)
    libnghttp2.so.14 => /usr/local/lib/libnghttp2.so.14 (0x00007f6c3dab6000)
    /lib64/ld-linux-x86-64.so.2 (0x000055cf5fba3000)

$ /usr/local/bin/curl -V
curl 7.53.1 (x86_64-pc-linux-gnu) libcurl/7.53.1 OpenSSL/1.1.0e zlib/1.2.7 nghttp2/1.21.0
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy

可以看到,已经支持openssl 1.1.0e 和 http2 。

更新系统链接库

现在基本完成了需要的编译工作,但是为了保证不出错,需要更新一下系统链接库。

$ echo "/usr/local/lib" >> /etc/ld.so.conf
$ echo "/usr/local/lib64" >> /etc/ld.so.conf
$ ldconfig -V    #使生效

安装oneinstack

到此为止,已经完成了前期的铺垫工作,可以开始装oneinstack了。

$ cd /home/test/oneinstack
$ screen -S lnmp
$ ./install.sh

我这里的选择是:Nginx-MysqL5.7-PHP7.1.3-opacache,其他的都没装。
不出意外的话,就可以等待着安装完成了。如果中间有退出shell,再次连接之后可以通过

screen -r

打开之前的安装窗口。安装完成后重启系统即可。
先写到这里,之后的一些额外配置下次再写。
先占个位

配置虚拟主机

搭建git服务器

通过hooks钩子自动同步git仓库内容到网站根目录

配置firewalld防火墙禁用无关端口

配置rm命令为mv命令,防止root误删 rm -rf /*

Nginx.conf的相关配置

搭建ss服务器

Centos7.3 升级最新Openssl1.1.0e同时编译安装lnmp环境使用最新openssl1.1.0e的更多相关文章

  1. ios中的.dylib和.a lib有什么区别?

    我知道Objectivec中的编译和运行时是什么,但是我想知道是什么画了这两个库之间的界限?他们的目的是什么,除了陈述一个是静态的而另一个是动态的?我们何时需要一个而不是另一个?

  2. xamarin.ios – ShareKit与MonoTouch如何?

    有人可以验证ShareKit实际上是否可用于MonoTouch并指导我完成使其工作所需的步骤?解决方法您首先从getsharekit.com下载还是使用ShareKit2.0?

  3. ios – 找不到lcrypto的库

    我正在尝试构建iOSAllJoyn项目,但我遇到了OpenSSL集成的问题.我一直在看这些方向:https://allseenalliance.org/docs-and-downloads/documentation/configuring-build-environment-ios-and-osx#unique_16我已经按照指示一直到XcodeIDEBuild,但现在我收到一个错误,上面写着:

  4. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

  5. ios – 有没有办法针对存档版本(.ipa)运行XCTest(UI)?

    要么我们可以单独构建和测试,以便我们可以先构建并在以后对该构建进行测试吗?

  6. ios – iPhone崩溃日志不能正确地符号化并且是双重间隔的

    任何建议超过欢迎.谢谢.解决方法当这件事发生在我身上时,它只是我通过电子邮件收到的日志.如果我记得,至少有一些是在.msg文件中,我不得不把它们拿出来.它可能是Exchange编码更改.如果你显示不可见的字符,你可能会看到每个字符之间的东西.您可以找到并替换它们以删除它们或更改编辑器中的编码.

  7. ios app如何“知道”运行单元测试

    我知道我可以用xcodebuild开始我的应用程序的单元测试,但我想知道是什么告诉应用程序在启动期间运行测试,它是一个发送到应用程序的特殊参数,还是以不同的方式编译以运行测试?

  8. ios – 如何在Swift中正确转换为子类?

    我有一个带有许多不同单元格的UITableView,基于数据源内容数组中的内容,它们应该显示自定义内容.在这里我得到了错误UITableViewCell没有属性customLabelQuestionTableViewCell有哪些.我的演员到QuestionTableViewCell有什么问题?解决方法问题不是你的演员,而是你的细胞宣言.您将其声明为可选的UITableViewCell,并且该声明

  9. ios – Xcode 7 beta 2:LaunchScreen.storyboard无法打开文档

    我在两个不同的Mac(iMac和MacBookpro)上收到这个错误.不知道为什么人们不能再现它,但我需要一些帮助.在运行XX优胜美地10.10.4的Mac上运行Xcode7beta2(15六月’15).甚至无法编译和运行我的项目..我从创建菜单创建了一个视图应用程序项目,就是这样.编辑:我试图删除并重新添加storyboard文件(也可以打开Main.storyboard插件),我仍然得到相同的

  10. xcode – 添加OCMock会导致Test启动主应用程序而不是运行测试

    我正在尝试将Ocmock添加到我现有的Cocoa项目中,但我遇到了一个我没有看到其他人覆盖的奇怪问题.我最终将它分离到以下内容:如果我只是将Ocmock.framework引用添加到我的项目中(即以某种方式将其拖到LinkBinaryWithLibraries构建阶段),当我运行测试时,真正的应用程序将被启动.没有Ocmock,输出正常:使用Ocmock框架链接(部分输出):此后,其他应用程序输出

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部