.NetCore中IdentityServer使用nginx-proxy的一次排错经历
前言
最近在看 Duende.IdentityServer.Admin,本地使用IIS Express跑了一下源碼,也看了一遍的代碼,決定使用他們的模板創(chuàng)建一個(gè)Demo,部署在本地的Docker環(huán)境中,也算是踩一下坑吧。以下不會(huì)詳細(xì)介紹項(xiàng)目的部署,只會(huì)介紹部署時(shí)遇到的問題。
創(chuàng)建 Duende.IdentityServer.Admin
首選安裝模板 ,此時(shí)最新版本 1.1.0,具體可以參考官方
dotnet?new?-i?Skoruba.Duende.IdentityServer.Admin.Templates::1.1.0然后可以就可以使用VS去創(chuàng)建了,當(dāng)然也可以使用命令行創(chuàng)建,具體在GitHub上已有說明,這里不做詳細(xì)贅述。
Docker部署
創(chuàng)建完項(xiàng)目之后,使用IIS Express運(yùn)行項(xiàng)目,幾乎沒有任何問題,接下來就是使用docker-compose去部署項(xiàng)目。docker-compose.yml代碼如下:
version:?'3.4'services:sqldata:image:?mcr.microsoft.com/mssql/server:2017-latestcontainer_name:?youthsoft-identityserver-dbidentity-sts:image:?${REGISTRY:-youthsoftdapr}/identity.sts:${TAG:-latest}build:context:?.dockerfile:?src/Services/Identity/YouthSoft.IdentityServer.STS.Identity/Dockerfilecontainer_name:?youthsoft-identity-stsidentity-admin:image:?${REGISTRY:-youthsoftdapr}/identity.admin:${TAG:-latest}build:context:?.dockerfile:?src/Services/Identity/YouthSoft.IdentityServer.Admin/Dockerfilecontainer_name:?"youthsoft-identity-admin"這里沒有配置具體的信息,具體信息配置在了docker-compose.override.yml文件中,如下:
version:?'3.4'services:sqldata:environment:-?SA_PASSWORD="${DB_PASSWORD:-Pass@word}"-?ACCEPT_EULA="Y"ports:-?"6433:1433"volumes:-?youthsoft-sqldata:/var/opt/mssqlidentity-sts:environment:-?ASPNETCORE_ENVIRONMENT=Development-?AdminConfiguration__IdentityAdminBaseUrl=http://localhost:6101-?ConnectionStrings__ConfigurationDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__PersistedGrantDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__IdentityDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__DataProtectionDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=trueports:-?"6101:6101"depends_on:-?sqldatavolumes:-?'./shared/serilog.json:/app/serilog.json'identity-admin:environment:-?VIRTUAL_HOST=admin.youthsoft.local-?ASPNETCORE_ENVIRONMENT=Development-?'AdminConfiguration__IdentityAdminBaseUrl=http://localhost:6102'-?AdminConfiguration__IdentityAdminRedirectUri=http://localhost:6102/signin-oidc-?AdminConfiguration__IdentityServerBaseUrl=http://localhost:6101-?ConnectionStrings__ConfigurationDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__PersistedGrantDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__IdentityDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__AdminLogDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__AdminAuditLogDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__DataProtectionDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=truedepends_on:-?identity-sts-?sqldatavolumes:youthsoft-sqldata:external:?falsenetworks:proxy:driver:?bridgeidentityserverui:driver:?bridge遇到的問題
問題1:IDX20804
說明:docker-compose 中 sts 設(shè)置的端口是 6101,訪問地址是 http://localhost:6101,admin設(shè)置的端口是6102,訪問地址是http://localhost:6102。理想狀態(tài)下打開http://localhost:6101 會(huì)打開sts,點(diǎn)擊 IdentityServer Admin 按鈕時(shí)會(huì)跳轉(zhuǎn)到admin,也就是http://localhost:6102,但是每次當(dāng)點(diǎn)擊跳轉(zhuǎn)的時(shí)候就會(huì)出現(xiàn)上邊的錯(cuò)誤,起初不是很理解,最后在GitHub的issue得到了啟發(fā)。
第一次打開http://localhost:6101時(shí)會(huì)打開sts,此時(shí)正常跳轉(zhuǎn)。但是當(dāng)點(diǎn)擊 IdentityServer Admin 時(shí),此時(shí)的http://localhost:6102就不是宿主機(jī)的地址了,而是sts容器中的地址,容器中沒有6102端口所以就無法打開。
解決方法
仔細(xì)查看了Duende.IdentityServer.Admin中的配置,發(fā)現(xiàn)要使用docker的話,就不能使用localhost,而是要使用域名,那本地如何設(shè)置域名呢?答案就是在windows的host文件中配置,在host文件中添加 127.0.0.1 admin.youthsoft.local sts.youthsoft.local,這樣這兩個(gè)域名就會(huì)運(yùn)行在本地,就可以實(shí)現(xiàn)localhost的功能。
同時(shí)還需要借助nginx將不同的域名代理到不同的容器中,這里使用了nginx-proxy,他可以根據(jù)docker-compose上的配置自動(dòng)生成ngxin的配置,也就是docker容器的自動(dòng)反向代理,詳細(xì)的使用可參考官方,使用起來也比較簡單,就是在環(huán)境變量中添加一個(gè) VIRTUAL_HOST配置,并指向前邊配置的本地域名,然后nginx-proxy在創(chuàng)建容器的時(shí)候就會(huì)自動(dòng)創(chuàng)建該容器的反向代理。
如下就是自動(dòng)生成的反向代理:
修改docker-compose.override.yml
version:?'3.4'services:nginx-proxy:image:?jwilder/nginx-proxycontainer_name:?nginx002ports:-?'80:80'volumes:-?'./shared/nginx/conf.d:/etc/nginx/conf.d'-?'/var/run/docker.sock:/tmp/docker.sock:ro'networks:proxy:?nullidentityserverui:aliases:-?sts.youthsoft.local-?admin.youthsoft.localrestart:?alwayssqldata:environment:-?SA_PASSWORD="${DB_PASSWORD:-Pass@word}"-?ACCEPT_EULA="Y"ports:-?"6433:1433"volumes:-?youthsoft-sqldata:/var/opt/mssqlnetworks:identityserverui:?nullidentity-sts:environment:-?VIRTUAL_HOST=sts.youthsoft.local-?ASPNETCORE_ENVIRONMENT=Development-?AdminConfiguration__IdentityAdminBaseUrl=http://admin.youthsoft.local-?'IdentityServerOptions__IssuerUri=http://sts.youthsoft.local'-?ConnectionStrings__ConfigurationDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__PersistedGrantDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__IdentityDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__DataProtectionDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=truedepends_on:-?sqldatavolumes:-?'./shared/serilog.json:/app/serilog.json'-?'./shared/nginx/certs/cacerts.crt:/usr/local/share/ca-certificates/cacerts.crt'networks:identityserverui:aliases:-?sts.youthsoft.localidentity-admin:environment:-?VIRTUAL_HOST=admin.youthsoft.local-?ASPNETCORE_ENVIRONMENT=Development-?'AdminConfiguration__IdentityAdminBaseUrl=http://admin.youthsoft.local'-?AdminConfiguration__IdentityAdminRedirectUri=http://admin.youthsoft.local/signin-oidc-?AdminConfiguration__IdentityServerBaseUrl=http://sts.youthsoft.local-?'IdentityServerData__Clients__0__ClientUri=http://admin.youthsoft.local'-?'IdentityServerData__Clients__0__RedirectUris__0=http://admin.youthsoft.local/signin-oidc'-?'IdentityServerData__Clients__0__FrontChannelLogoutUri=http://admin.youthsoft.local/signin-oidc'-?'IdentityServerData__Clients__0__PostLogoutRedirectUris__0=http://admin.youthsoft.local/signout-callback-oidc'-?'IdentityServerData__Clients__0__AllowedCorsOrigins__0=http://admin.youthsoft.local'-?'IdentityServerData__Clients__1__RedirectUris__0=http://admin-api.youthsoft.local/swagger/oauth2-redirect.html'-?ConnectionStrings__ConfigurationDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__PersistedGrantDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__IdentityDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__AdminLogDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__AdminAuditLogDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=true-?ConnectionStrings__DataProtectionDbConnection=Server=sqldata;Database=YouthSoftIdentityServerAdmin;User?Id=sa;Password=${DB_PASSWORD:-Pass@word};TrustServerCertificate=truedepends_on:-?identity-sts-?sqldatanetworks:identityserverui:?nullvolumes:youthsoft-sqldata:external:?falsenetworks:proxy:driver:?bridgeidentityserverui:driver:?bridge注意:本次修改的配置文件中,修改了數(shù)據(jù)庫初始化文件(identityserverdata.json)中種子數(shù)據(jù)中的地址。這就要先把之前遷移生成的數(shù)據(jù)庫先刪掉,或者把數(shù)據(jù)庫中的地址改成和配置文件中的地址一樣,建議還是先刪掉再重新執(zhí)行一次遷移。
問題2:找不到任何可成功連接的IP (sts.youthsoft.local:80)
大部分人可能都不會(huì)遇到這個(gè)問題,但是這個(gè)問題困擾了我好久,錯(cuò)誤也捕捉不到,原因就是我的80端口被占用了,CMD執(zhí)行 netstat -aon|findstr "80"命令,發(fā)現(xiàn)除了docker占用了80端口,還有其它程序也占用了80端口,一看原來是我開著FastGithub.UI這個(gè)程序,這個(gè)程序主要就是加速GitHub的訪問,平時(shí)訪問github時(shí)不能出來的圖片,在打開它后也可以出來,經(jīng)常逛GitHub的朋友可以用一下。如果有類似的問題,可以排查一下80端口是否被占用。
解決方法:
關(guān)閉掉程序就可以打開了。
問題3:跳轉(zhuǎn) IdentityServer Admin 時(shí),nginx報(bào)502錯(cuò)誤
上邊一切就緒,但是在跳轉(zhuǎn)到IdentityServer Admin時(shí),出現(xiàn)了nginx 502錯(cuò)誤,在查看了nginx容器的日志后,找到了問題。
upstream sent too big header while reading response header from upstream
解決方法
解決方法就是在nginx配置的http段添加以下配置
proxy_buffer_size??????????128k; proxy_buffers??????????????4?256k; proxy_busy_buffers_size????256k;但是nginx的配置是自動(dòng)生成的啊,怎么辦?我們可以把 nginx的 conf.d 文件夾掛載到本地,并在文件夾中創(chuàng)建一個(gè) .conf 結(jié)尾的文件,比如:proxy.conf,內(nèi)容就存放上邊的配置即可。因?yàn)樵?nginx.conf 的http段有一個(gè)配置,默認(rèn)會(huì)包含 conf.d 文件夾下的所有配置文件。include /etc/nginx/conf.d/*.conf;
重新運(yùn)行docker-compose 發(fā)現(xiàn)就可以
寫在最后
排錯(cuò)是痛苦的,但是也是成長最快的方法,因?yàn)樵诮?jīng)歷一番折騰后得出的知識(shí)印象也最深刻。
總結(jié)
以上是生活随笔為你收集整理的.NetCore中IdentityServer使用nginx-proxy的一次排错经历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FluentEmail - 适用于 .N
- 下一篇: 使用基于Roslyn的编译时AOP框架来