1. 程式人生 > >Jexus 在centos上配置 https 和 gzip(包括1 jexus設定 2..net core程式碼修改 3.http跳轉https 4.開啟gzip)

Jexus 在centos上配置 https 和 gzip(包括1 jexus設定 2..net core程式碼修改 3.http跳轉https 4.開啟gzip)

 

一、只需要配置jexus,將現有的http網站改成https

1.首先檢視“/lib”或“/usr/lib”等系統庫資料夾中是否有SSL庫檔案的名字,該檔名應該是“libssl.so.版本號”(find / -name libssl.so.*),如果沒有列出檔名,就證明你的系統還沒有安裝OpenSSL,請安裝後再操作。

find / -name libssl.so.*

2.查詢到結果的話,如圖

3.進入jexus解壓目錄

cd /usr/jexus
ls

4.進入mono lib目錄

cd runtime/lib
ls

5.將找到的SSL庫建立軟鏈到mono lib目錄下

ln -s /usr/lib64/libssl.so.10 libssl.so

備註:/usr/lib64/libssl.so.10 是本機搜尋出來的絕對路徑,並非寫死的路徑

6.啟網站的HTTPS功能

  開啟站點配置(siteconf)下的配置項,啟用https(其實解開註釋項即可),注意:埠修改為443

複製程式碼

port=443
hosts=xxx.com  

UseHttps=true
ssl.certificate=/x/xxx.pem
ssl.certificatekey=/x/xxx.key
ssl.protocol=TLSv1.2 

複製程式碼

7.重啟jexus

./jws restart

8.輸入https://xxx.com 測試

二、為了更好的使用https,需要修改你的.net core 程式碼

之前看到一篇部落格 https://www.cnblogs.com/jjg0519/p/8572202.html   

作者提到還需要在.net core程式中新增程式碼啟用https,否則微信支付,微軟OAuth等需要回調的功能就沒法使用。

就這個問題和宇內討論後,他的建議是.net core內部不要再啟用https,做兩次https效能會下降。

為了更好的使用https功能(獲取客戶端真實的IP地址、埠,以及是http還是https)需要修改一下程式碼,

  jexus作者宇內流雲寫了一箇中間件JwsIntegration.cs(IIS也有類似的中介軟體),加到專案裡,然後在program.cs裡程式碼如下,

  public static IWebHost BuildWebHost(string[] args) =>
        
        WebHost.CreateDefaultBuilder(args)
           .UseJexusIntegration() //加這一句即可
           .UseStartup<Startup>()

           .Build(); 

JwsIntegration.cs程式碼如下:

/*******JwsIntegration.cs程式碼開始*******************/

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;


namespace Microsoft.AspNetCore
{


    /// <summary>
    /// 用於處理客戶IP地址、埠、協議的HostBuilder中介軟體
    /// </summary>
    public static class JwsWebHostBuilderExtensions
    {


        /// <summary>
        /// 啟用JexusIntegration中介軟體
        /// </summary>
        /// <param name="hostBuilder"></param>
        /// <returns></returns>
        public static IWebHostBuilder UseJexusIntegration(this IWebHostBuilder hostBuilder)
        {
            if (hostBuilder == null)
            {
                throw new ArgumentNullException(nameof(hostBuilder));
            }


            // 檢查是否已經載入過了
            if (hostBuilder.GetSetting(nameof(UseJexusIntegration)) != null)
            {
                return hostBuilder;
            }




            // 設定已載入標記,防止重複載入
            hostBuilder.UseSetting(nameof(UseJexusIntegration), true.ToString());




            // 新增configure處理
            hostBuilder.ConfigureServices(services =>
            {
                services.AddSingleton<IStartupFilter>(new JwsSetupFilter());
            }); return hostBuilder;
        } 
    }


    class JwsSetupFilter : IStartupFilter
    {
        public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
        {
            return app =>
            {
                app.UseMiddleware<JwsMiddleware>();
                next(app);
            };
        }
    }




    class JwsMiddleware
    {
        RequestDelegate _next;
        public JwsMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<IISOptions> options)
        {
            _next = next;
        }


        public async Task Invoke(HttpContext httpContext)
        {
            var headers = httpContext.Request.Headers;


            try
            {
                //解析訪問者IP地址和埠號
                if (headers != null && headers.ContainsKey("X-Original-For"))
                {
                    var ipaddAdndPort = headers["X-Original-For"].ToArray()[0];
                    var dot = ipaddAdndPort.IndexOf(":");
                    var ip = ipaddAdndPort;
                    var port = 0;
                    if (dot > 0)
                    {
                        ip = ipaddAdndPort.Substring(0, dot);
                        port = int.Parse(ipaddAdndPort.Substring(dot + 1));
                    }


                    httpContext.Connection.RemoteIpAddress = System.Net.IPAddress.Parse(ip);
                    if (port != 0) httpContext.Connection.RemotePort = port;
                }


                //處理HTTP/HTTPS協議標記
                if (headers != null && headers.ContainsKey("X-Original-Proto"))
                {
                    httpContext.Request.Scheme = headers["X-Original-Proto"].ToArray()[0];
                }
            }
            finally
            {
                await _next(httpContext);
            } 
        }

    }
 

}

/*******JwsIntegration.cs程式碼j結束*******************/

三、使用者輸入Http地址自動跳轉到https

   實現這個功能很簡單,只要增加一個80地址,host指向一個不存在的地址(這裡一定要指向一個不存在的地址,任意輸入字元也行,但不能是*,如果為*,使用者輸入http也能開啟頁面,位址列不會顯示https,展示的內容可能不完整),root也指向不存在的即可。這樣的做法好像有點像偏方,但是和宇內溝通後,的確是這樣做的。這樣做的目的只有一個,就是開啟伺服器的80埠。如果伺服器上有一個80埠的網站,你什麼也不用做就可以實現跳轉。至於跳轉到哪個網站,你輸入的url裡已經包含了地址資訊,jexus會自動匹配對應的網站。

 

四.開啟gzip壓縮

   jexus本身就帶了gzip功能,但是那是針對,net core之前的版本的,對於.net core由於jexus只是埠轉發,所以不會啟用gzip,需要在.net core程式中自行開啟。

1. 通過nuget安裝微軟的 ResponseCompress中介軟體

2. 在startup.cs中的configureServices方法中新增如下程式碼

services.Configure<GzipCompressionProviderOptions>(options =>
            options.Level = System.IO.Compression.CompressionLevel.Optimal);//壓縮比
            services.AddResponseCompression(options =>
            { 
                options.EnableForHttps = true; //注意,如果在jexus中開啟了https,這裡一定要設定成true,否則不會壓縮
               options.MimeTypes =new[]   //壓縮的檔案型別
                {
                    // General
                    "text/plain",
                    // Static files
                    "text/css",
                    "application/javascript",
                    // MVC
                    "text/html",
                    "application/xml",
                    "text/xml",
                    "application/json",
                    "text/json",
                };
                options.Providers.Add<GzipCompressionProvider>();
            });

3.在 Configure方法中新增如下程式碼

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        { 
            app.UseResponseCompression();//放在usemvc前面

至此gzip已經開啟了

 

4.檢查gzip效果

用chrome開啟網頁,按F12進入除錯介面,點network標籤,Content-Encoding列預設無,可以在列頭中把它勾選出來。Size列展示的就是壓縮過的大小,可以和原檔案進行一下對比,可見壓縮率是非常可觀的,相當於winrar的壓縮比