最近因為項目上的需要,使用.net core寫了一個服務,用於指定word模板文件與數據,完成數據的填充(word讀寫使用npoi)與格式轉換(使用aspose,將word轉pdf)。之所以選擇用.net core就是考慮到跨平台部署的問題。
1、打開powershell,使用ssh登錄到服務器(以172.16.170.41為例):
ssh root@172.16.170.41
輸入密碼即可登錄;
2、安裝.net core3.1(我們的服務是使用3.1版本開發的):
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1
安裝完了運行dotnet --version,如果能查看版本說明安裝成功;
3、將我們本地編譯發布好的服務文件copy到服務器上
在本地powershell里輸入:scp -r C:\pdfservice root@172.16.170.41:/var/www/pdfservice
這條命令表示拷貝本地C:\pdfservice下的所有文件,到41服務器的/var/www/pdfservice目錄下(會自動創建pdfservice目錄);
4、安裝jexus。jexus是一款國產開源免費應用服務器,功能與Nginx類似,但是更加能夠發揮.net core程序的優勢。
curl https://jexus.org/release/x64/install.sh | sudo sh
完成后,會生成/usr/jexus目錄。其中/usr/jexus/siteconf目錄下用來存放jexus的配置文件。
5、配置jexus。
進入/usr/jexus/siteconf目錄下
vi pdfservice新建一個配置文件(也可以使用默認配置文件default)
輸入“i”進入編輯模式, copy以下內容:
########################################
port=5555
root=/ /var/www/pdfservice/
hosts=* #OR your.com,*.your.com
# User=www-data
# AspNet.Workers=2 # Set the number of asp.net worker processes. Defauit is 1.
# addr=0.0.0.0
# CheckQuery=false
NoLog=true
AppHost={
cmd=dotnet /var/www/pdfservice/CATSTI.PdfService.dll;
root=/var/www/pdfservice/;
port=0;
}
# NoFile=/index.aspx
# Keep_Alive=false
# UseGZIP=false
# UseHttps=true
# ssl.certificate=/x/xxx.crt #or pem
# ssl.certificatekey=/x/xxx.key
# ssl.protocol=TLSv1.0 # TLSv1.1 or TLSv1.2...
# ssl.ciphers=
# DenyFrom=192.168.0.233, 192.168.1.*, 192.168.2.0/24
# AllowFrom=192.168.*.*
# DenyDirs=~/cgi, ~/upfiles
# indexes=myindex.aspx
# Deny asp ...
# rewrite=^/.+?\.(asp|cgi|pl|sh|bash|dll)(\?.*|)$ /.deny->$1
# rewrite=.*/editor/.+ /.deny->editor
# reproxy=/bbs/ http://192.168.1.112/bbs/
# host.Redirect=abc.com www.abc.com 301
# ResponseHandler.Add=myKey:myValue
# Jexus php fastcgi address is '/var/run/jexus/phpsvr'
#######################################################
# fastcgi.add=php|socket:/var/run/jexus/phpsvr
其中:
port=5555 表示jexus監聽5555端口;
root=/ /var/www/pdfservice/ 表示服務的根目錄;
AppHost={
cmd=dotnet /var/www/pdfservice/CATSTI.PdfService.dll;
root=/var/www/pdfservice/;
port=0;
}
中的=dotnet /var/www/pdfservice/CATSTI.PdfService.dll 表示服務的入口是使用.net把CATSTI.PdfService.dll啟動起來;
修改完成后,按“esc”鍵返回瀏覽模式,再按“:”鍵,輸入wq保存退出;如果輸入q!表示不保存退出。
6、重啟jexus服務並在centos的防火牆中放開5555端口
重啟jexus:service jexus restart
放開5555端口:firewall-cmd --zone=public --add-port=5555/tcp --permanent
重啟防火牆:firewall-cmd --reload
7、如果順利,服務就可以正式使用了。如果不順利,就百度吧(:P)
8、安裝字體。由於我們的服務使用word作為模板, 用到的字體在服務器上不一定全,因此需要把涉及到的字體安裝到服務器。可以參考這個帖子做:https://www.cnblogs.com/qize/p/12522886.html
~~采坑更新(1)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
實際現場實施過程中,同事發現,當使用多文檔合並輸出pdf時,會發生錯誤“The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception”。
百度有說到aspose的.net core版本會使用SkiaSharp來處理圖像,SkiaSharp是微軟官方用於在.net core下進行圖像處理的中間件。而在centos環境下報錯的“原因是linux下skiasharp依賴libSkiaSharp.so,而如果系統中沒有libSkiaSharp.so,就會報這個錯”。而我們發布的安裝包里確實沒有這個文件。
最后程序猿MM通過如下方式解決了:
1、替換文件SkiaSharp.dll;
2、新增文件libSkiaSharp.so (下載地址:https://github.com/mono/SkiaSharp/releases/tag/v1.59.3),將文件copy至pdfservice目錄下;
3、賦權限:chmod 77 libSkiaSharp.so;
4、檢測libSkiaSharp.so依賴情況:ldd libSkiaSharp.so ;通過這個命令可以查看ibSkiaSharp.so依賴哪些文件,以及這些文件是否缺失(缺失的文件會在后面提示“not found”。對於缺失的文件,我們對應去網上查詢一下要怎么安裝。以下5、6是我們發現缺失需要安裝的)
5、yum install fontconfig;
6、yum install libGL;
7、重啟jexus。
給我們的程序猿MM手動點贊!
~~采坑更新(2)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
現場同事發現生產環境生成pdf時,如果post上去的數據較大(例如:包含幾張大圖)時,就會出錯。
解決方案是將對應的post方法加上注解[DisableRequestSizeLimit],去掉長度限制: