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的壓縮比