nginx+tomcat+ssl

申请免费的SSL证书

目前SSL证书大部分都是要收费的。对于企业网站,建议还是花点钱买个安心吧,而对于个人网站,可以选择免费的Let's encrypt。

安装SSL证书的过程并不复杂,第一步是申请证书,第二步是在Nginx中配置证书路径。

(1)安装certbot工具

yum install epel-release

yum install certbot

这个工具会在 你的网站根目录(也就是/usr/local/nginx/html)/.well-known 生成特殊的文件,在申请证书时,Let's Encrypt 服务会通过 http 来访问此文件,以签证服务器,所以在使用 certbot 获取证书之前,你要确保可以浏览器中能够通过http正常访问服务器。

(2)申请证书

certbot certonly -a webroot --webroot-path=/usr/local/nginx/html -d xxx.com -d www.xxx.com


这里的--webroot-path指定网站的根目录,使用-d来指定应用证书的域名,如果有多个,使用多个-d就可以(一般至少应该两个,一个没有www、一个有www)。
nginx+tomcat+ssl_第1张图片

最终会在 /etc/letsencrypt/live/xxx.com 下,生成四个 PEM 文件

cert.pem: 域名证书

chain.pem:Let's Enctrypt chain certificate

fullchain.pem:cert.pem 和 chain.pem 组成

privkey.pem:证书的私钥

我们需要用到的是后面的两个:fullchain.pem和privkey.pem

(3)在Nginx中应用证书

这一步见下一部分的具体配置。

(4)配置自动更新证书

因为 Let's Encrypt 的证书有效期是90天,到期前要更新证书。certbot 提供了更新证书的命令 cerbot renew。添加一个 conb job 来实现自动更新

crontab -e

输入

30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

35 2 * * 1 /usr/bin/systemctl reload nginx


保存即可创建 cron job。以后每周1的凌晨2点30自动更新证书,2点35自动重启nginx。
终极配置之前先看一下我画的一个图(个人理解)
nginx+tomcat+ssl_第2张图片

Nginx与Tomcat终极整合

Nginx对于静态内容的处理能力非常强,跟Tomcat整合我们一般会将静态资源交给Nginx来处理,同时,考虑到我们会使用静态化技术来将页面转为html并会用到文件上传功能,所以,我们要将Nginx目录的权限也交给tomcat用户,以便其可以正常将文件写入到/usr/local/nginx/html目录下。

chown -R tomcat:tomcat /usr/local/nginx

修改/usr/local/nginx/conf/nginx.conf,内容如下,我已经在要关注的地方进行了说明。这个配置主要实现了以下几项功能:

(1)与Tomcat服务器整合(支持集群)

(2)支持ssl,对特定目录强制使用https协议,其他目录则可以分别使用两种协议

(3)与php整合,对phpMyAdmin增加多一重auth basic验证


user root;
#user  nobody;
worker_processes  1;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
        types_hash_max_size 2048;
        #注意这里我们包含了一个proxy.conf文件,该文件也是位于/usr/local/nginx/conf目录,
        include proxy.conf;
        #下面这堆配置主要用来限制并发连接数,以及压缩内容节省带宽
        limit_conn_zone $binary_remote_addr zone=addr:10m;
    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip on;   
    gzip_min_length  1k;   
    gzip_buffers     4  16k;   
    gzip_http_version 1.0;   
    gzip_comp_level 2;   
    gzip_types  text/plain application/x-javascript text/css application/xml;   
    gzip_vary on;
    server { 
        listen       80; 
        server_name  yaofuqiang.cn www.yaofuqiang.cn; 
            location /{
            return 307 https://www.yaofuqiang.cn;
            }   
    }     
    server { 
        listen       80; 
        server_name  game.yaofuqiang.cn; 
    location /{
        return 307 https://game.yaofuqiang.cn;
    }

    }     
    server { 
        listen       80; 
        server_name  blog.yaofuqiang.cn; 
    location /{
        return 307 https://blog.yaofuqiang.cn;
    }
    }     
    #监听https协议(默认443端口)
    server {
    listen 443 ssl;
    server_name www.yaofuqiang.cn;
    server_tokens off;
    charset utf-8;
    #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致
    limit_conn addr 5;
    #只允许我们的域名访问
    if ($host !~ ^(yaofuqiang.cn|www.yaofuqiang.cn)$ ) {
        return 444;
    }
    #屏蔽非法请求类型
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    #拒绝异常的User-Agents
    if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
        return 403;
    }
    if ($http_user_agent ~* Sosospider|YodaoBot) {
        return 403;
    }
    #设置网站根目录
    root /usr/local/tomcat/web_index/ROOT;
    #设置默认首页
    index index.html index.htm index.php;
    include /etc/nginx/default.d/*.conf;
    #配置ssl证书
    ssl_certificate /etc/letsencrypt/live/yaofuqiang.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yaofuqiang.cn/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    #静态请求
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
            root   /usr/local/tomcat/web_index/ROOT;   
            expires  30d;
        }
    #admin目录转交Tomcat处理
    location ~ /admin/ {
        proxy_pass http://139.199.211.49:8080;
    }
    #动态请求
    location ~  \.(do|jsp|action|jspx|shtml)$  {
            proxy_pass http://139.199.211.49:8080;
            proxy_redirect off; 
            proxy_set_header Host $host;   
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            client_max_body_size 10m;   #允许客户端请求的最大单文件字节数 
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 
            proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间 
            proxy_read_timeout 90;     #连接成功后,后端服务器响应时间 
            proxy_buffer_size 4k;      #设置代理服务器(nginx)保存用户头信息的缓冲区大小 
            proxy_buffers  6  32k;       #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) 
            proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 
        }
    #phpMyAdmin目录转交php处理
    location ~ /phpMyAdmin/ {
        fastcgi_index index.php;
        location ~ .*\.(php|php5)?$ {
            #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include fastcgi_params;
        }
        #/配置auth_basic验证
        auth_basic "security";
        #密码保存在哪里
        auth_basic_user_file /usr/local/nginx/conf/passwd;
    }
    error_page 404 /404.html;
    location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    }
    server {
    listen 443 ssl;
    server_name game.yaofuqiang.cn;
    server_tokens off;
    charset utf-8;
    #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致
    limit_conn addr 5;
    #只允许我们的域名访问
    if ($host !~ ^(game.yaofuqiang.cn)$ ) {
        return 444;
    }
    #屏蔽非法请求类型
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    #拒绝异常的User-Agents
    if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
        return 403;
    }
    if ($http_user_agent ~* Sosospider|YodaoBot) {
        return 403;
    }
    #设置网站根目录
    root /usr/local/tomcat/web_game/ROOT;
    #设置默认首页
    index index.html index.htm index.php;
    include /etc/nginx/default.d/*.conf;
    #配置ssl证书
    ssl_certificate /etc/letsencrypt/live/game.yaofuqiang.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/game.yaofuqiang.cn/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    #静态请求
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
            root   /usr/local/tomcat/web_game/ROOT;   
            expires  30d;
        }
    #admin目录转交Tomcat处理
    location ~ /admin/ {
        proxy_pass http://139.199.211.49:8081;
    }
    #动态请求
    location ~  \.(do|jsp|action|jspx|shtml)$  {
            proxy_pass http://139.199.211.49:8081;
            proxy_redirect off; 
            proxy_set_header Host $host;   
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            client_max_body_size 10m;   #允许客户端请求的最大单文件字节数 
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 
            proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间 
            proxy_read_timeout 90;     #连接成功后,后端服务器响应时间 
            proxy_buffer_size 4k;      #设置代理服务器(nginx)保存用户头信息的缓冲区大小 
            proxy_buffers  6  32k;       #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) 
            proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 
        }
    #phpMyAdmin目录转交php处理
    location ~ /phpMyAdmin/ {
        fastcgi_index index.php;
        location ~ .*\.(php|php5)?$ {
            #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include fastcgi_params;
        }
        #/配置auth_basic验证
        auth_basic "security";
        #密码保存在哪里
        auth_basic_user_file /usr/local/nginx/conf/passwd;
    }
    error_page 404 /404.html;
    location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    }
    server {
    listen 443 ssl;
    server_name blog.yaofuqiang.cn;
    server_tokens off;
    charset utf-8;
    #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致
    limit_conn addr 5;
    #只允许我们的域名访问
    if ($host !~ ^(blog.yaofuqiang.cn)$ ) {
        return 444;
    }
    #屏蔽非法请求类型
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }
    #拒绝异常的User-Agents
    if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
        return 403;
    }
    if ($http_user_agent ~* Sosospider|YodaoBot) {
        return 403;
    }
    #设置网站根目录
    root /usr/local/tomcat/web_blog/ROOT;
    #设置默认首页
    index index.html index.htm index.php;
    include /etc/nginx/default.d/*.conf;
    #配置ssl证书
    ssl_certificate /etc/letsencrypt/live/blog.yaofuqiang.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.yaofuqiang.cn/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    #静态请求
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
            root   /usr/local/tomcat/web_blog/ROOT;   
            expires  30d;
        }
    #admin目录转交Tomcat处理
    location ~ /admin/ {
        proxy_pass http://139.199.211.49:8082;
    }
    #动态请求
    location ~  \.(do|jsp|action|jspx|shtml)$  {
            proxy_pass http://139.199.211.49:8082;
            proxy_redirect off; 
            proxy_set_header Host $host;   
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            client_max_body_size 10m;   #允许客户端请求的最大单文件字节数 
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 
            proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间 
            proxy_read_timeout 90;     #连接成功后,后端服务器响应时间 
            proxy_buffer_size 4k;      #设置代理服务器(nginx)保存用户头信息的缓冲区大小 
            proxy_buffers  6  32k;       #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) 
            proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 
        }
    #phpMyAdmin目录转交php处理
    location ~ /phpMyAdmin/ {
        fastcgi_index index.php;
        location ~ .*\.(php|php5)?$ {
            #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include fastcgi_params;
        }
        #/配置auth_basic验证
        auth_basic "security";
        #密码保存在哪里
        auth_basic_user_file /usr/local/nginx/conf/passwd;
    }
    error_page 404 /404.html;
    location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    }
}

上面的配置文件中我们还调用了两个配置文件:proxy.conf、passwd。

proxy.conf的内容如下:

proxy_redirect off; #代理重定向关闭

proxy_set_header Host $host; #从header头中获取的主机名

proxy_set_header X-Real-IP $remote_addr;#获取header头中获取的主机的真实IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取header头中获取代理者的真实ip

proxy_set_header X-Forwarded-Proto $scheme;

server_names_hash_bucket_size 128;

large_client_header_buffers 4 32k; #设置请求缓存

client_header_buffer_size 64k; #客户端上传文件缓存大小

client_max_body_size 300m; #设置客户端能够上传文件大小

client_body_buffer_size 512k;

proxy_connect_timeout 60; #跟后台服务器连接超时时间发起握手等待响应超时时间

proxy_send_timeout 90; #后台服务器数据回传时间,就是在规定时间内后端服务器必须传完所有数据

proxy_read_timeout 90; #连接成功后,等待服务器响应时间,其实已经进入后端的排队之中等待处理

proxy_buffer_size 16k; #设置请求缓存区,这个缓存区会保存用户的头信息,以供nginx进行规则处理,一般只要能保存下头信息即可

proxy_buffers 4 64k; #告诉nginx保留单个用到几个Buffer最大用多少空间

proxy_busy_buffers_size 128k; #代理忙碌时使用的缓冲区大小

proxy_temp_file_write_size 128k;#缓存临时文件的大小

而passwd文件则要通过命令来生成:

printf "admin:$(openssl passwd -crypt admin888)\n" >>/usr/local/nginx/conf/passwd


上面的admin是用户名、admin888是密码。当我们访问http://xxx.com/phpMyAdmin的时候,将会先弹出以下提示,然后才进入正常的登陆界面。




除了配置Nginx外,我们还要配置Tomcat。

打开/usr/local/tomcat/conf/server.xml,在 节增加如下内容:




remoteIpHeader="X-Forwarded-For"

protocolHeader="X-Forwarded-Proto"

protocolHeaderHttpsValue="https"/>








你可能感兴趣的:(Linux)