승객 / nginx 뒤에서 Sinatra 앱을 실행하고 있습니다. http 및 https 호출에 모두 응답하도록 노력하고 있습니다. 문제는 둘 다 서버 블록에 정의되어있을 때 https 호출이 정상적으로 응답되지만 http가 400 “일반 HTTP 요청이 HTTPS 포트로 전송되었습니다”오류를 생성한다는 것입니다. 이것은 정적 페이지 용이므로 Sinatra가 이것과 아무 관련이 없다고 생각합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
다음은 서버 블록입니다.
server {
listen 80;
listen 443 ssl;
server_name localhost;
root /home/myhome/app/public;
passenger_enabled on;
ssl on;
ssl_certificate /opt/nginx/ssl_keys/ssl.crt;
ssl_certificate_key /opt/nginx/ssl_keys/ssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location /static {
root /home/myhome/app/public;
index index.html index.htm index.php;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 /500.html;
access_log /home/myhome/app/logs/access.log;
error_log /home/myhome/app/logs/error.log;
}
답변
비슷한 문제가 발생했습니다. 한 서버에서 작동하며 동일한 Nginx 구성을 가진 다른 서버에서는 작동하지 않습니다. 여기에서 Igor가 답변 한 솔루션을 찾았습니다. http://forum.nginx.org/read.php?2,1612,1627#msg-1627
예. 또는 SSL / 비 SSL 서버를 하나의 서버에 결합 할 수 있습니다.
server {
listen 80;
listen 443 default ssl;
# ssl on - remember to comment this out
}
답변
연결 보안에 관계없이 http를 통해 페이지를 제공 할 수 있도록 ‘이 연결 HTTPS’테스트를 대부분 무시한다는 점에서 위의 답변은 올바르지 않습니다.
NGINX 특정 http 4xx 오류 코드의 오류 페이지를 사용하여 클라이언트가 https로 동일한 요청을 재 시도하도록 리디렉션하는 보안 답변입니다. (여기에 설명 된대로 /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )
OP는 다음을 사용해야합니다.
server {
listen 12345;
server_name php.myadmin.com;
root /var/www/php;
ssl on;
# If they come here using HTTP, bounce them to the correct scheme
error_page 497 https://$host:$server_port$request_uri;
[....]
}
답변
오류는 실제로 모든 것을 말합니다. 구성은 Nginx에 포트 80 (HTTP)에서 수신하고 SSL을 사용하도록 지시합니다. 브라우저를 http://localhost
로 지정하면 HTTP를 통해 연결을 시도합니다. Nginx는 SSL을 예상하기 때문에 오류로 불평합니다.
해결 방법은 매우 간단합니다. 두 개의 server
섹션 이 필요 합니다.
server {
listen 80;
// other directives...
}
server {
listen 443;
ssl on;
// SSL directives...
// other directives...
}
답변
나는 똑같은 문제가 있었고 귀하의 예와 동일한 구성이 있으며 줄을 제거하여 작동하게했습니다.
ssl on;
문서를 인용하려면 :
HTTP 및 HTTPS 서버가 동일하면 “ssl on”지시문을 삭제하고 * : 443 포트에 대한 ssl 매개 변수를 추가하여 HTTP 및 HTTPS 요청을 모두 처리하는 단일 서버를 구성 할 수 있습니다.
답변
상태 코드 에 대한 위키피디아 기사에 따르면 . http 트래픽이 https 포트로 전송 될 때 Nginx에 사용자 지정 오류 코드가 있습니다 (오류 코드 497).
그리고 error_page의 nginx 문서에 따르면 특정 오류에 대해 표시 될 URI를 정의 할 수 있습니다.
따라서 오류 코드 497이 발생할 때 클라이언트가 전송 될 URI를 만들 수 있습니다.
nginx.conf
#lets assume your IP address is 89.89.89.89 and also
#that you want nginx to listen on port 7000 and your app is running on port 3000
server {
listen 7000 ssl;
ssl_certificate /path/to/ssl_certificate.cer;
ssl_certificate_key /path/to/ssl_certificate_key.key;
ssl_client_certificate /path/to/ssl_client_certificate.cer;
error_page 497 301 =307 https://89.89.89.89:7000$request_uri;
location / {
proxy_pass http://89.89.89.89:3000/;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
}
}
그러나 클라이언트가 GET을 제외한 다른 방법을 통해 요청하면 해당 요청은 GET으로 바뀝니다. 따라서 클라이언트가 들어온 요청 방법을 보존합니다. error_page의 nginx 문서에 표시된대로 오류 처리 리디렉션을 사용합니다.
이것이 우리가 301 =307
리디렉션 을 사용하는 이유 입니다.
여기에 표시된 nginx.conf 파일을 사용하여 http 및 https가 동일한 포트에서 수신하도록 할 수 있습니다.
답변
다음은 ipv6을 지원하는 동일한 구성 블록에서 HTTP 및 HTTPS 를 구성하는 예 입니다. 구성은 Ubuntu Server 및 NGINX / 1.4.6 에서 테스트 되었지만 모든 서버에서 작동합니다.
server {
# support http and ipv6
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
# support https and ipv6
listen 443 default_server ssl;
listen [::]:443 ipv6only=on default_server ssl;
# path to web directory
root /path/to/example.com;
index index.html index.htm;
# domain or subdomain
server_name example.com www.example.com;
# ssl certificate
ssl_certificate /path/to/certs/example_com-bundle.crt;
ssl_certificate_key /path/to/certs/example_com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
}
오류 ssl on
가 발생할 수있는 항목은 포함하지 마십시오 400
. 위의 구성은
도움이 되었기를 바랍니다!
답변
phpmyadmin을 사용하는 경우 : fastcgi_param HTTPS on;