首页 > 代码库 > centos7安装tengine强制使用HTTPS访问

centos7安装tengine强制使用HTTPS访问

操作系统:centos7.2 x64
tengine:Tengine/2.2.0
主机IP: 10.0.0.12

 

一、安装tengine

    1.1 下载源码安装包

        1.1.1 源码包pcre-8.40
            用于支持正则表达式

            [root@tengine ~]# cd /usr/local/src/
            [root@tengine src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz

 
        1.1.2 源码包zlib-1.2.11
            用于支持数据压缩

            [root@tengine src]# wget http://zlib.net/zlib-1.2.11.tar.gz

 
        1.1.3 源码包openssl-1.0.2
            用于数据加密及支持SSL协议

            [root@tengine src]# wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz

 
        1.1.4 源码包jemalloc-4.4.0
            用于优化内存管理

            [root@tengine src]# wget https://github.com/jemalloc/jemalloc/archive/4.4.0.tar.gz

 
        1.1.5 源码包tengine-2.2.0

            [root@tengine src]# wget http://tengine.taobao.org/download/tengine-2.2.0.tar.gz
            [root@tengine src]# ls
            jemalloc-4.4.0.tar.gz  openssl-1.0.2k.tar.gz  pcre-8.40.tar.gz  tengine-2.2.0.tar.gz  zlib-1.2.11.tar.gz

 

    1.2 编译安装依赖包

        1.2.1 更新工具包

            [root@tengine src]# yum install openssl-devel zlib-devel -y

 
        1.2.2 编译pcre

            [root@tengine src]# tar xf pcre-8.40.tar.gz
            [root@tengine src]# cd pcre-8.40
            [root@tengine pcre-8.40]# ./configure --prefix=/usr/local/pcre
            [root@tengine pcre-8.40]# make && make install

 
        1.2.3 编译openssl

            [root@tengine src]# tar xf openssl-1.0.2k.tar.gz
            [root@tengine src]# cd openssl-1.0.2k
            [root@tengine openssl-1.0.2k]# ./config --prefix=/usr/local/openssl
            [root@tengine openssl-1.0.2k]# make && make install


        1.2.4 编译zlib

            [root@tengine src]# tar xf zlib-1.2.11.tar.gz
            [root@tengine src]# cd zlib-1.2.11
            [root@tengine zlib-1.2.11]# ./configure --prefix=/usr/local/zlib
            [root@tengine zlib-1.2.11]# make && make install

 
        1.2.5 编译jemalloc

            [root@tengine src]# tar xf jemalloc-4.4.0.tar.gz
            [root@tengine src]# cd jemalloc-4.4.0
            [root@tengine jemalloc-4.4.0]# ./autogen.sh
            autoconf
            ./autogen.sh: line 5: autoconf: command not found
            Error 0 in autoconf

            # 安装autoconf包
            [root@tengine jemalloc-4.4.0]# yum install autoconf -y
            [root@tengine jemalloc-4.4.0]# ./autogen.sh
            [root@tengine jemalloc-4.4.0]# make
            [root@tengine jemalloc-4.4.0]# make install
            /usr/bin/install: cannot stat ‘doc/jemalloc.html’: No such file or directory
            make: *** [install_doc_html] Error 1
            # 这里只是说明文档和html页面没有,可以忽悠这个错误,可以直接touch
            [root@tengine jemalloc-4.4.0]# touch doc/jemalloc.html
            [root@tengine jemalloc-4.4.0]# make install
            [root@tengine jemalloc-4.4.0]# touch doc/jemalloc.3
            [root@tengine jemalloc-4.4.0]# make install 

 
        1.2.8 加载库文件

            [root@tengine tengine-2.2.0]# echo /usr/local/pcre/lib/ > /etc/ld.so.conf.d/pcre.conf
            [root@tengine tengine-2.2.0]# echo /usr/local/zlib/lib/ > /etc/ld.so.conf.d/zlib.conf
            [root@tengine tengine-2.2.0]# echo /usr/local/openssl/lib/ > /etc/ld.so.conf.d/openssl.conf
            [root@tengine tengine-2.2.0]# echo /usr/local/lib/ > /etc/ld.so.conf.d/local.conf
            [root@tengine tengine-2.2.0]# ldconfig -v | less
            /usr/local/lib:
                    libjemalloc.so.2 -> libjemalloc.so.2
            /usr/local/openssl/lib:
            /usr/local/pcre/lib:
                    libpcrecpp.so.0 -> libpcrecpp.so.0.0.1
                    libpcreposix.so.0 -> libpcreposix.so.0.0.4
                    libpcre.so.1 -> libpcre.so.1.2.8
            /usr/local/zlib/lib:
                    libz.so.1 -> libz.so.1.2.11
                    ......
                    ......

 
        1.2.7 编译tengine

            [root@tengine src]# tar xf tengine-2.2.0.tar.gz
            [root@tengine src]# cd tengine-2.2.0
            # 创建tengine运行用户
            [root@tengine tengine-2.2.0]# groupadd -g 80 www
            [root@tengine tengine-2.2.0]# useradd -u 80 -g 80 -s /sbin/nologin -M www
            # 注意,在编译tengine时候,pcre, openssl, zlib必须指向源码目录,而jemalloc不能指向源码目录。切记!
            [root@tengine tengine-2.2.0]# ./configure --prefix=/usr/local/tengine --user=www --group=www             --with-http_stub_status_module             --with-http_ssl_module             --with-http_gzip_static_module             --with-openssl=/usr/local/src/openssl-1.0.2k             --with-pcre=/usr/local/src/pcre-8.40             --with-zlib=/usr/local/src/zlib-1.2.11             --with-jemalloc

            [root@tengine tengine-2.2.0]# make
            [root@tengine tengine-2.2.0]# make install

            [root@tengine tengine-2.2.0]# cd /usr/local/tengine/
            [root@tengine tengine]# ls
            conf  html  include  logs  modules  sbin
            [root@tengine tengine]# echo PATH=$PATH:/usr/local/tengine/sbin/ > /etc/profile.d/tengine.sh
            [root@tengine tengine]# cat !$
            cat /etc/profile.d/tengine.sh
            PATH=$PATH:/usr/local/tengine/sbin/
            [root@tengine tengine]# source /etc/profile.d/tengine.sh
            [root@tengine tengine]# nginx
            [root@tengine tengine]# netstat -ntplu | grep nginx
            tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      53295/nginx: master

            # tengine编译成功!

            # 验证jemalloc是否生效
            [root@tengine tengine]# yum install lsof -y
            [root@tengine tengine]# lsof -n | grep jemalloc
            nginx     23371         root  mem       REG              253,0   2584161   34723136 /usr/local/lib/libjemalloc.so.2
            nginx     23372          www  mem       REG              253,0   2584161   34723136 /usr/local/lib/libjemalloc.so.2
            # jemalloc 已生效!

 
    1.3 编写服务,实现开机启动

        [root@tengine tengine-2.2.0]# vim /usr/lib/systemd/system/tengine.service

        [Unit]
        Description=The nginx HTTP and reverse proxy server
        After=syslog.target network.target remote-fs.target nss-lookup.target

        [Service]
        Type=forking
        PIDFile=/usr/local/tengine/logs/nginx.pid
        ExecStartPre=/usr/local/tengine/sbin/nginx -t
        ExecStart=/usr/local/tengine/sbin/nginx
        ExecReload=/bin/kill -s HUP $MAINPID
        ExecStop=/bin/kill -s QUIT $MAINPID
        PrivateTmp=true

        [Install]
        WantedBy=multi-user.target    

        [root@tengine tengine-2.2.0]# nginx -s stop
        [root@tengine tengine-2.2.0]# systemctl status tengine
        ● tengine.service - The nginx HTTP and reverse proxy server
           Loaded: loaded (/usr/lib/systemd/system/tengine.service; disabled; vendor preset: disabled)
           Active: inactive (dead)

        # 启动服务
        [root@tengine tengine-2.2.0]# systemctl start tengine
        [root@tengine tengine-2.2.0]# netstat -ntplu | grep nginx
        tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      23429/nginx: master

        # 设置开机启动
        [root@tengine tengine-2.2.0]# systemctl enable tengine
        Created symlink from /etc/systemd/system/multi-user.target.wants/tengine.service to /usr/lib/systemd/system/tengine.service.

 


二、tengine配置SSL并强制使用HTTPS访问

    2.1 使用openssl 生成 SSL key 和 CSR

        [root@tengine ~]# mkdir /etc/ssl/private
        [root@tengine ~]# cd /etc/ssl/private/    
        [root@tengine private]# openssl req -new -newkey rsa:2048 -sha256 -nodes -out super_com.csr -keyout super_com.key -subj "/C=CN/ST=Beijing/L=Beijing/O=Super Inc./OU=Web Security/CN=super.com"

        # 这里为了实验,我们自行签发不受浏览器信任的SSL证书

        [root@tengine private]# openssl x509 -req -days 365 -in super_com.csr -signkey super_com.key -out super_com.crt
        Signature ok
        subject=/C=CN/ST=Beijing/L=Beijing/O=Super Inc./OU=Web Security/CN=super.com
        Getting Private key

 
    2.2 为tengine配置SSL协议认证
        这里配置建议使用以下两种方式:            
            (1)通过tengine write配置正则跳转的方式,该方式会占用服务器资源;
            (2)通过html meta 跳转的方式,百度采用这种方式;
        2.2.1 tengine write方式实现:

            [root@tengine ~]# cd /usr/local/tengine/conf/
            [root@tengine conf]# vim nginx.conf
            ...
            ...
            http {
                server {
                    listen       80;
                    server_name  www.super.com;
                    rewrite ^(.*)$ https://$host$1 permanent;                    # 访问的所有url都跳转为https协议
                    ...
                    ...
                    }
                include vhost/.conf;
            }
            ...
            ...            
            [root@tengine conf]# mkdir /usr/local/tengine/conf/vhost
            [root@tengine conf]# cd /usr/local/tengine/conf/vhost
            [root@tengine vhost]# vim ssl.conf

            server {
              listen       443 ssl;
              ssl on;
              ssl_certificate /etc/ssl/private/example_com.crt;
              ssl_certificate_key /etc/ssl/private/example_com.key;
              location / {
                root /usr/local/tengine/html/ssl;
                index index.html;
              }
            }
            # 创建网站根目录和测试页面
            [root@tengine vhost]# mkdir /usr/local/tengine/html/ssl
            [root@tengine vhost]# cd !$
            cd /usr/local/tengine/html/ssl
            [root@tengine ssl]# echo hello 10.0.0.12 > index.html


            [root@tengine conf]# echo 10.0.0.12    www.super.com >> /etc/hosts
            [root@tengine conf]# ping www.super.com
            PING www.super.com (10.0.0.12) 56(84) bytes of data.
            64 bytes from www.super.com (10.0.0.12): icmp_seq=1 ttl=64 time=0.057 ms
            # 重新加载tengine
            [root@tengine conf]# nginx -t
            nginx: the configuration file /usr/local/tengine/conf/nginx.conf syntax is ok
            nginx: configuration file /usr/local/tengine/conf/nginx.conf test is successful
            [root@tengine conf]# nginx -s stop     # 这里reload不生效可以尝试关闭,在开启
            [root@tengine conf]# nginx
            [root@tengine conf]# netstat -ntplu | grep nginx
            tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      23513/nginx: master
            tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      23513/nginx: master
            [root@tengine conf]# setenforce 0; systemctl stop firewalld     # 关闭selinux和防火墙

 


            # 编辑本地主机hosts文件。C:\Windows\System32\drivers\etc\hosts
            10.0.0.12             www.super.com

            浏览器访问:http://www.super.com/
            技术分享

        2.2.2 通过html meta 跳转的方式实现:

            [root@tengine conf]# vim nginx.conf
            # 将rewrite注释
            #rewrite ^(.*)$  https://$host$1 permanent;
            [root@tengine conf]# cd /usr/local/tengine/html/
            [root@tengine html]# vim index.html

            <html>
            <meta http-equiv="refresh" content="0;url=https://www.super.com/">
            </html>

 


            技术分享

centos7安装tengine强制使用HTTPS访问