日本高清免费一本视频100禁_在线不卡欧美精品一区二区三区_国产一区二区好的精华液_中文综合在线_国产啊啊啊视频在线观看_大地资源网免费观看高清

中國專業(yè)IT外包服務

用心服務每一天
IT之道-艾銻知道

您當前位置: 主頁 > 資訊動態(tài) > 艾銻分享 >

服務器維護CentOS 7環(huán)境下使用Nginx托管.Net Core應用程序


2020-06-07 13:44 作者:admin
服務器維護CentOS 7環(huán)境下使用Nginx托管.Net Core應用程序
 
 
如何做好服務器維護?北京艾銻無限科技與你談談IT人員必須知道的服務器維護信息
 
服務器維護小知識一、安裝.Net Core
參考官方文檔:https://www.microsoft.com/net/core#linuxcentos
服務器維護小知識服務器維護小知識1、添加dotnet產品Feed
在安裝.NET Core之前,您需要注冊Microsoft產品Feed。這只需要做一次。首先,注冊Microsoft簽名密鑰,然后添加Microsoft產品Feed
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
服務器維護小知識2、安裝.NET Core SDK
sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.0.0
之后運行命令
dotnet --info
可以查看安裝是否成功。至此,.Net Core的安裝就完成了。
當然,也可以使用解壓安裝。到 https://www.microsoft.com/net/download/linux 下載CentOS7對應的sdk壓縮包,之后解壓到自定義的安裝路徑。
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
# 可以設置一下環(huán)境變量,也可以采用下面的方式建立軟鏈接,因為 /usr/local/bin 默認包含于$PATH中
sudo ln -s /opt/dotnet/dotnet /usr/local/bin
# 之后運行查看安裝結果
dotnet --info
服務器維護小知識二、編譯運行項目
1、新建一個mvc項目
dotnet new mvc -o ntmvc
 查看ntmvc文件夾 ,可以發(fā)現,一個mvc項目的模板已經建好了,如下:
2、修改   Startup.cs 文件
可以使用vscode直接修改遠程計算機或者是虛擬機中的文件,具體參考  http://www.linuxidc.com/Linux/2017-10/147241.htm
由于后面要用到nginx搭建反向代理,在此處修改一下Startup.cs文件中的代碼,添加引用 using Microsoft.AspNetCore.HttpOverrides;
之后再在 Startup.cs 文件的 Configure 方法中添加一段代碼(具體參見下面完整的Startup.cs文件):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
//添加引用
using Microsoft.AspNetCore.HttpOverrides;
 
namespace ntmvc
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
 
        public IConfiguration Configuration { get; }
 
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
 
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
 
            app.UseStaticFiles();
 
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            
            //添加下面的代碼
            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
            });
 
            app.UseAuthentication();
        }
    }
}
 3、生成項目
首先切換到項目目錄ntmvc,之后運行下面的命令
dotnet publish -c Release
 
服務器維護小知識 運行命令之后,項目目錄中會多出一個bin文件夾
服務器維護小知識 在bin文件夾中會包含Release文件夾,在Release文件夾中的netcoreapp2.0文件夾中,會包含可以發(fā)布的內容,即publish文件夾。
服務器維護小知識注:publish文件夾之外的內容,同我們運行 dotnet run 命令時所生成的文件是相同的,只不過Debug文件夾換成了自己命名的Release文件夾而已。換句話說,運行dotnet publish -c Release 比運行 dotnet run 多了一個publish文件夾,而這個文件夾正是所要發(fā)布的內容
 
服務器維護小知識4、運行項目 
切換到publish文件夾,運行命令
dotnet nmvc.dll
如下圖所示:
服務器維護小知識 5、項目的開機自動運行
接下來設置項目的開機自動啟動,在 /etc/systemd/system/ 中新建一個服務文件
vim /etc/systemd/system/kestrel-ntmvc.service
內容如下:
[Unit]
Description=Example .NET Web MVC Application running on Centos7
 
[Service]
WorkingDirectory=/root/ntmvc
ExecStart=/usr/bin/dotnet /root/ntmvc/bin/Release/netcoreapp2.0/publish/ntmvc.dll
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production
 
[Install]
WantedBy=multi-user.target
之后保存,運行以下命令:
systemctl enable kestrel-ntmvc.service
systemctl start kestrel-ntmvc.service
systemctl status kestrel-ntmvc.service
注意:如果檢查到錯誤,需要修改 kestrel-ntmvc.service 文件,修改正確之后,需要運行以下命令重新啟動:
systemctl daemon-reload
systemctl restart kestrel-ntmvc.service
 
 到此為止,一個簡單的項目就可以正常訪問了。接下來,對項目進行改造,引入nginx的使用。
服務器維護小知識三、編譯安裝nginx
1、安裝依賴項
yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel
2、下載安裝包
最新的下載地址請到官網獲取。
wget http://nginx.org/download/nginx-1.13.5.tar.gz
3、解壓
mkdir nginxfiles
tar -zxvf nginx-1.13.5.tar.gz -C nginxfiles
4、切換目錄
cd nginxfiles/
cd nginx-1.13.5/
 
 5、編譯安裝
執(zhí)行以下命令
# 配置:這里需要安裝額外的模塊
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream --with-mail=dynamic
# 編譯
make
# 安裝
make install
 
 6、創(chuàng)建軟鏈接
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin
 如上所述,這樣可以不用再設置環(huán)境變量。
 
服務器維護小知識四、證書相關 
為了增強項目的安全性,有時需要將http訪問轉為https訪問。通過對nginx中ssl模塊進行設置,可以實現這一點。
通常,這需要向CA申請安全證書(常用免費證書:https://letsencrypt.org/ )。
由于這里僅作測試用,因此使用自己生成的證書。
1、證書的生成
在root目錄下建立certs文件夾,切換到該文件夾,依次運行以下命令:
# 建立服務器私鑰(過程需要輸入密碼,請記住這個密碼)生成RSA密鑰
openssl genrsa -des3 -out testcert.key 1024  

# 生成一個證書請求  需要依次輸入國家,地區(qū),組織,email,common name等,common name可以寫你的名字或者域名。如果為了https申請,必須和域名吻合,否則會引發(fā)瀏覽器警報。
openssl req -new -key testcert.key -out testcert.csr

# 生成不需要密碼的key
openssl rsa -in testcert.key -out testcert_nopwd.key  

# 生成crt文件
openssl x509 -req -days 365 -in testcert.csr -signkey testcert_nopwd.key -out testcert.crt
 
2、證書的位置
將證書復制到 /etc/ssl/certs/ 目錄
 cp testcert.crt /etc/ssl/certs/
 cp testcert_nopwd.key /etc/ssl/certs/testcert.key
 如下圖:
 3、迪菲-赫爾曼密鑰交換 
一般來說,之后修改nginx.conf配置文件就可以了。為了進一步增強安全性,可以進行迪菲-赫爾曼密鑰交換,在 /etc/ssl/certs/ 目錄中
openssl dhparam -out dhparam.pem 4096生成文件 
 
服務器維護小知識五、nginx配置文件相關 
1、自定義 proxy.conf 文件 
在 /usr/local/nginx/cong/ 目錄下新建 proxy.conf 文件,后面會在nginx.conf中引用此文件。
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;
proxy_set_header    X-Forwarded-Proto $scheme;
client_max_body_size     10m;
client_body_buffer_size 128k;
proxy_connect_timeout     90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffers            32 4k;
2、修改 nginx.conf 文件
修改 /usr/local/nginx/cong/ 目錄下的nginx.conf文件,著重點已經使用了不同的顏色進行標注。
 
worker_processes  1;
 
events {
    worker_connections  1024;
}
 
http {
    include       proxy.conf;
    include       mime.types;
    default_type  application/octet-stream;  
 
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    server_tokens off;
 
    sendfile        on;
    #tcp_nopush     on;
    
    keepalive_timeout  29;
    client_body_timeout 10;
    client_header_timeout 10;
    send_timeout 10;   
 
    upstream ntmvc{
        server localhost:5000;
    }
 
 
    server {
       
        listen       80;
        add_header Strict-Transport-Security max-age=15768000;
        return 301 https://$host$request_uri;
    }  
 
 
    # HTTPS server
    #
    server {
        listen *:443    ssl;
        server_name     localhost;
        ssl_certificate /etc/ssl/certs/testcert.crt;
        ssl_certificate_key /etc/ssl/certs/testcert.key;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on; #ensure your cert is capable
        ssl_stapling_verify on; #ensure your cert is capable
 
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
 
        #Redirects all traffic
        location / {
            proxy_pass  http://ntmvc;
            limit_req   zone=one burst=10 nodelay;
            limit_req_status 503;
        }
    }
 
 

 服務器維護小知識六、nginx 開機自動啟動
# 設置nginx自啟動,在/lib/systemd/system/ 目錄下創(chuàng)建一個服務文件
vim /lib/systemd/system/nginx.service
 注意,這里的路徑是 /lib/systemd/system/ ,而非上面ntmvc項目自啟動服務文件所在的 /etc/systemd/system/ 這一點值得注意。
 內容如下:
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
 
[Install]
WantedBy=multi-user.target
 
 文件編輯完成之后,運行以下命令啟動服務:
systemctl enable nginx.service
# 啟動nginx服務
systemctl start nginx.service
# 查看狀態(tài)
systemctl status nginx.service
 這里之所以有一個警告,是因為我們使用的證書是自己生成的,而不是正式的證書。
通常,對配置文件修改后需要重啟服務,執(zhí)行以下命令:
# 如果修改了文件,這個是必須的
systemctl daemon-reload
# 重新啟動服務
systemctl restart nginx.service
 服務器維護小知識七、防火墻相關
 以下的三個端口是必須要開的 ,其他的視情況而定。
#端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=5000/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
#開端口后必須重新加載
firewall-cmd --reload
# 查看所有打開的端口:
firewall-cmd  --list-ports
 
 重新加載并顯示端口
 
 
服務器維護小知識八、訪問相關
以上的配置完成之后,如果環(huán)境使用的是真實的物理機,或者是橋接的虛擬機,直接訪問ip地址就可以了。
如果是NAT連接的虛擬機,需要進行端口映射。本實驗使用的VirtualBox 搭建的虛擬機,以此為例,按下圖進行設置即可。
如果是直接在虛擬機中進行瀏覽,瀏覽127.0.0.1 或者localhost 即可。
服務器維護小知識如果是從主機進行訪問,可在主機的瀏覽器中輸入https://192.168.56.1:1518,即可映射到虛擬機的443端口,這樣就可以通過https進行訪問虛擬機中的ntmvc項目。
服務器維護小知識由于在nginx.conf中配置了 add_header Strict-Transport-Security max-age=15768000;  即只能允許https訪問, 因此輸入http://192.168.56.1:1518 會提示錯誤。
服務器維護小知識正常的訪問結果如下圖所示(谷歌瀏覽器),之所以會出現這樣的提示,是因為所用的證書是自己生成的。
 
 繼續(xù)訪問即可訪問ntmvc中的頁面,如下圖:
 
IT運維  我們選擇北京艾銻無限
以上文章由北京艾銻無限科技發(fā)展有限公司整理
 

相關文章

IT外包服務
二維碼 關閉
主站蜘蛛池模板: 大陆一级片_一级成人黄色片_av无码一区二区三区午夜_成人在线黄色_密臀av一区二区三区_在线免费黄色小视频_久久亚洲福利_成人午夜网址 | 亚洲熟妇无码爱V在线观看_国产九一视频在线观看_看日本黄色片_精品99在线视频_午夜私人影院久久久久_国产人成亚洲第一网站在线播放_91这里只有精品_馬与人黃色毛片一部 | 激情伊人五月天久久综合_放荡少妇张开双腿任人玩_国产一区二区久久久_99国产在线精品_国产在线视频一区二区_成人一区二_成人一级视频在线观看_a成人毛片 | 狠狠综合久久综合88亚洲_亚洲欧洲中文日韩乱码av_免费黄色av网址_精品高潮呻吟99av无码视频_啦啦啦在线观看视频免费观看_大地资源在线视频资源_成人1区2区3区_北条麻妃一区二区免费播放 | 别插我b嗯啊视频免费_色婷婷av一本二本三本浪潮_182午夜免费_青青青草伊人_久久久免费国产_综合色91_最近中文mv字幕免费高清在线7_色噜噜狠狠色综合成人网 | 亚洲AV无码AV有码AV_国产精品99蜜臀久久不卡二区_欧美a网站_www.youjizz在线_大伊香蕉精品一区视频在线_亚洲专区在线视频_一二三四在线视频_韩国一级淫片免费看 | 国产精品xxxx18a99_亚洲三级片福利视频_少妇性BBB搡BBB爽爽爽视頻_久久久aa裸体视频_激情小说另类小说亚洲欧美_国产精品久久久久久av公交车_色视频成人在线观看免_夫妻午夜视频 | 最近最新MV在线观看免费高清_午夜免费剧场_神马老子影院午夜观看网站_国产1区2区3区中文字幕_国产五十路毛片_色综合人人_日韩一区久久_亚洲欧洲美洲在线观看 | 久久99精品久久久久久秒播放器_福利社区一区二区_国产精品一区二区av交换_成年人免费视频_欧美日韩亚洲在线_jj男色网_热re99久久精品国产99热_国产欧美另类久久久精品 | 成年美女黄网站色大免费视频_久草资源在线_2015成人永久免费视频_色偷偷AV男人的天堂京东热_免费播放一级毛片_青青草原亚洲_一区二区三区的视频_国产在沙发上午睡被强 | 中文天堂在线WWW最新版官网_国产精品性爱_高清一区在线观看_国产精品国产三级国产专区50_91精品视频在线免费观看_亚州av在线_丁香伊人网_国产精品美女一区 | 亚洲夜夜性无码_国产欧美日韩久久久久_亚洲无嘛_成人你懂的_久久视频在线_成人美女视频免费_国产精品老熟女露脸视频_精品亚洲成a人无码成a在线观看 | 18禁黄无遮挡网站免费_日本亚洲精品无码专区_狠狠爱免费视频_亚洲一区二区三区四区五区乱码_在线观看免费视频18_农村妇女野战bbxxx_欧美性生活精品_JK制服白丝超短裙自慰 | 7777久久香蕉成人影院_日韩人妻熟女中文字幕A美景之屋_wwwjizz欧美_日韩a免费_夜夜躁恨恨躁爱躁_亚洲成在人线AV无码_久久国内免费视频_用舌头去添高潮无码视频 | 亚洲jizzjizz妇女_性色AV无码中文AV有码VR_色夜av_久久久www免费人成黑人精品_亚洲线精品一区二区三区四区_四虎影视久久久免费观看_99久久精品免费看国产一区二区三区_日本国产一区二区三区 | 国产区av_国产91成人精品亚洲精品_国产aⅴ一区二区_青青草手机视频_久久久SS麻豆欧美国产日韩_久久亚洲欧洲国产精品一区二区_91大神在线资源观看无广告_亚洲国产精品婷婷久久久久 | 精品一区二区三区影院在线午夜_国产成人AV综合亚洲色欲_交换娇妻呻吟hd中文字幕_东北老富婆高潮大叫对白_日日摸夜夜添夜夜躁好吊_97婷婷狠狠成为人免费视频_成人网站网址在线观看播放_波多野结衣av一本一道 国产毛片一线_亚洲性生活片_天天干干夜夜_超碰男人_妞干网国产_3D动漫同人精品无码专区_2021av视频_国产精品久久久久久久久久久痴汉 | 免费在线全程观看_视频一区二区国产无限在线观看_国产原厂视频在线观看_MM1313亚洲精品无码久久_91人妻人人澡人人爽人人精品_亚洲熟妇色XXXXⅩ欧美_国产视频一区二区三区在线_日本艳妓BBW高潮一19 | 污污内射在线观看一区二区少妇_国产公开久久人人97超碰_免费无码一区二区三区A片_黄色在线观看视频_九色porny丨首页原版_国产超碰人人模人人爽人人喊_亚洲a∨成熟国产一区二区成熟一级毛片_亚洲午夜影院在线观看 | 少妇无码精品在线观看_寂寞少妇一区二区三区_欧美35页视频在线观看_日韩一中文字无码不卡_亚洲国产成人久久综合一区77_国产69精品久久久久久久_69ww免费视频播放器_亚洲在线观看一区 | 男人j桶进女人p无遮挡免费的视频_亚洲kkk4444在线观看_极品少妇被啪到呻吟喷水_国产精品臀控福利在线观看_97视频国产自在自线2020_视频h在线_国产成人午夜福利r在线观看观看_午夜福利啪啪片 | 一级毛片免费在线_雪白浑圆高耸光滑呻吟_伊人精品_伊人久久综合精品久久_欧美精品综合_一夜新娘第三季高清免费观看_亚洲综合精品一区_成人一级免费视频 | 精品国产一区二区三区在线_国产第一精品_日韩手机视频_亚洲一本视频_免费国产一级淫片_日本网站视频_欧美精品成人_国产亚洲精品久久午夜玫瑰园 | 国产日产久久欧美清爽_操操操视频_黄色影视在线播放_天天综合网永久_久久婷婷色香五月综合缴缴情_久久日韩粉嫩一区二区三区_日本精品免费_国产综合色在线播放 | 欧美疯狂性受XXXXX喷水_91av影视_日本乱人片一区二区三区_性色AV无码不卡中文字幕_最新av网站在线观看_欧美亚洲熟女一区二区视频_成人A级毛片免费观看AV_av爱爱com | 一本色道久久综合狠狠躁篇的优点_青青青国产在线视频_欧美大肚子孕妇疯狂作爱视频_一级免费毛片_国产乱人****在线观看_天天射寡妇射视频_麻豆调教_91特黄 | 5g国产精品影院天天5g天天爽_欧美又大又粗无码视频_国产综合色一区二区三区_天天爽天天_九九精品在线视频_色片免费在线观看_国产精品一区二区三区不卡_久久久久久久一区 | 国产乡下三级全黄三级BD_日本在线观看一区二区_www国产精品com_亚洲精品色在线网站_国产人成在线视频_成全世界免费高清观看_在线黑人抽搐潮喷_抽插丰满内射高潮视频 | 男人天堂免费_小少妇的粉嫩小泬_www蜜桃视频_国产无遮挡裸露视频免费_成人性生交片无码免费看_国产亚洲自在精品久久_日产日韩在线亚洲欧美_夜夜看人久看2022 | 亚洲精品人人_丁香五月缴情在线中文视频_18禁美女黄网站色大片免费看_色蜜av_一二三中文字幕_欧美黑人一级爽快片淫片高清_理论片午午伦夜理片影院_欧美一级视频在线 | 又黄又无遮挡AAAAA毛片_人妻AV综合天堂一区_日韩久久久精品首页一本在线免费视频_成人年无码AV片在线观看_免费看片日韩_欧美日本一区二区_一区二区三区日本久久久_欧美极品videos粗暴 | 亚洲情综合五月天_久色精品视频_凹凸69堂国产成人精品_日日日插插插_91麻豆精品国产自产在线游戏_亚洲va中文字幕无码久久不卡_亚洲激情一级片_永久黄网站色视频免费观看 | 无码H黄肉3D动漫在线观看_午夜网站在线_av之家免费黄片_日本少妇裸体视频_中文字幕欧洲_色久天堂_国产成人欧美一区二区三区八_国产亚洲欧美一级 | 国产精品亚洲欧美大片在线观看_色偷偷wwww88888_日本伦理一区_91av网站在线观看_国产精品无码高清在线_97香蕉久久国产超碰青草软件_CHINESE熟妇与小伙子MATURE_亚洲二页 | 99久久综合精品免费_日本免费A级毛一片_欧美日韩亚洲国产综合_97色伦图片97综合影院_中文字幕免费视频观看_中文字幕a∨在线乱码免费看_亚洲福利_99热蜜臀 | 看免费黄色大片_素人天堂_www中文在线观看_亚洲视频在线网站_丰满的熟女爽死你视频_麻豆免费视频观看_av片免费看_久久无码中文字幕免费影院蜜桃 | 国产亚洲欧美一区二区三区四区_99热综合_一区二区精彩视频_欧美一二三四五六七区_日韩免费视频在线观看_四虎一区二区_影音先锋黄色网址_成人hd | 国产裸体视频_好猛好深好爽喷水无码视频_久久久久成人片免费观看_午夜在线观看免费线无码视频_亚洲高清视频一区二区三区_欧美视频区_亚洲精品视频二区_中文字幕综合视频 | 国产免费自拍av_亚洲成人蜜桃_中文字幕乱码亚洲无线三区_无限动漫视频在线观看免费动漫_真人性囗交69视频_久久婷婷国产综合一区二区_孕妇奶水仑乱A级毛片在线播放_国产精品99久久99久久久二 | 色欲视频综合免费天天_麻豆网站在线看_久久久久久久久久一区二区_91国内视频在线_欧美毛多水多肥妇_无码裸模视频在线观看_国产精品久人妻精品老妇_a级毛片免费 | 国产19页_亚洲日韩精品欧美一区二区_日本中文字幕视频在线观看_国产在线看片_中文字幕AⅤ在线视频_亚洲鲁丝片一区二区三区_亚洲1区_亚洲午夜一区 |