阿里云centos Apache打开HTTP/2和ALPN的详细方法

起因是看到Chrome 60开始有一个Audits的功能,忍不住试了一下,发现我的服务器仍然在使用HTTP/1.1,这个被扣分感觉很不爽。

持证也有一段日子了。发现这问题后在SSLlab上测试了自己的服务器发现了更多的问题!!

必须折腾!

我搜索到这个,大量参考他的方法,不过发现最新版Apache(2.4.29)已经有点不适应这个教程了。

首先,阿里云的ECS已经有一些系统级的依赖,所以环境并不需要太多东西。

搞定yum之后的必须环境,这里因为php我用的是php71w-fpm,有对应的mysql,所以不卸载php,只卸载之前用yum安装过的httpd

yum -y remove httpd
yum -y install wget curl curl-devel gcc gcc-c++

接下来安装PCRE 1

cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
tar -zxf pcre-8.41.tar.gz
cd pcre-8.41
./configure --prefix=/usr/local/pcre
make && make install

ALPN只在OpenSSL 1.02后支持,所以OpenSSL要装1.02n

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz
tar -zxf openssl-1.0.2n.tar.gz
cd openssl-1.0.2n
./config --openssldir=/usr/local/openssl zlib-dynamic shared
make && make test && make install
cat > /etc/ld.so.conf.d/openssl.conf << EOF
/usr/local/openssl/lib
EOF
ldconfig

nghttp2

cd /usr/local/src
wget https://github.com/nghttp2/nghttp2/releases/download/v1.29.0/nghttp2-1.29.0.tar.gz
tar -zxf nghttp2-1.29.0.tar.gz
cd nghttp2-1.29.0
./configure --prefix=/usr/local/nghttp2
make && make install

最后是apr apr-utilApache

这里非常重要:--with-mpm一定要设成event或者worker,因为从Apache 2.4.27起mod_http2不再支持默认的prefork模式

如果使用的话之后启动httpd,查看log会看到一个warning:

AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.

意思是可以继续启动,但不会启用HTTP/2

以下是Apache 2.4.29的安装代码

cd /usr/local/src
wget http://mirrors.hust.edu.cn/apache/apr/apr-1.6.3.tar.gz
wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.29.tar.gz
tar -zxf apr-1.6.3.tar.gz
tar -zxf apr-util-1.6.1.tar.gz
tar -zxf httpd-2.4.29.tar.gz
mv apr-1.6.3 httpd-2.4.29/srclib/apr
mv apr-util-1.6.1 httpd-2.4.29/srclib/apr-util
cd httpd-2.4.29
./configure \
--prefix=/usr/local/apache \
--with-pcre=/usr/local/pcre \
--with-mpm=event \
--with-included-apr \
--with-ssl=/usr/local/openssl \
--with-nghttp2=/usr/local/nghttp2 \
--enable-modules=all \
--enable-mods-shared=all \
--enable-so \
--enable-ssl \
--enable-http2
make && make install

下面仍然是照抄:)

cp -f /usr/local/apache/bin/apachectl /etc/init.d/httpd
# 拷贝文件到 init.d 里
sed -i '2a # chkconfig: - 85 15' /etc/init.d/httpd
sed -i '3a # description: Apache is a World Wide Web server. It is used to server' /etc/init.d/httpd

chkconfig --add httpd
chkconfig httpd on
# 将 httpd 的 2、3、4、5 运行级设置为 On,即开机启动
 
rm -rf /etc/httpd
ln -s /usr/local/apache/ /etc/httpd
# /etc/httpd 为运行目录
cd /usr/sbin/
ln -fs /usr/local/apache/bin/httpd
ln -fs /usr/local/apache/bin/apachectl

cd /var/log
rm -rf httpd/
ln -s /usr/local/apache/logs httpd

groupadd apache
useradd -g apache -s /sbin/nologin apache

Apache的配置

配置上稍微有点繁琐,因为情况不一样,要完全脱离那个教程了。

可以完全使用之前yum安装用的conf。
主conf在 /usr/local/apache/conf/httpd.conf 这个位置

ServerRoot "/usr/local/apache"
Listen 80

LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule data_module modules/mod_data.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule dialup_module modules/mod_dialup.so
LoadModule http2_module modules/mod_http2.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so

User apache
Group apache
ServerName localhost:80
<Directory />
    AllowOverride none
    Require all denied
    RewriteEngine on
    RewriteBase /
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Directory>
DocumentRoot "你的网站主目录"
<Directory "你的网站主目录">
   Options Indexes FollowSymLinks
   AllowOverride All #为了让.htaccess和.htpassword生效。
   Require all granted
</Directory>
IncludeOptional conf/extra/*.conf

...

ServerTokens ProductOnly
ServerSignature Off

然后/usr/local/apache/conf/extra/httpd-ssl.conf,这个配置默认可能写在httpd-vhosts.conf里。

<VirtualHost _default_:443>
Protocols h2 http/1.1
</VirtualHost>

php-fpm.conf放入到extra里,开始服务吧。

/etc/init.d/httpd start

SSLlab上测试下,会发现还是给了C

优化一下/usr/local/apache/conf/extra/httpd-ssl.conf,

<VirtualHost _default_:443>
Protocols h2 http/1.1
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 #disable SSLv3,已经被抛弃了
SSLCipherSuite HIGH:!aNULL:!eNULL:!kECDH:!aDH:!RC4:!3DES:!CAMELLIA:!MD5:!PSK:!SRP:!KRB5:@STRENGTH #这里主要是disable RC4
SSLHonorCipherOrder on 

...证书设置

</VirtualHost>

再起服务,应该可以可以拿到A了。

不知道TSL更新到1.3是不是又一个大坑。

Leave a Reply

Your email address will not be published. Required fields are marked *