5

I am working on enabling http2 in nginx docker. I am getting this error when I calling to localhost. My nginx configuration file as below.

server {
listen       2020 http2;
server_name  localhost;

#charset koi8-r;
#access_log  /var/log/nginx/host.access.log  main;

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}

Http2 listen port is 2020. I have exposed it to 2020 when the container is started.

docker run -d --name nginx -p 80:80 -p 2020:2020 -v 
/home/pubudu/work/nginx/nginx-tms/config/conf.d:/etc/nginx/conf.d/:ro  
nginx:latest

This is the tutorial link: How To Set Up Nginx with HTTP/2 Support on Ubuntu 16.04

Do i need to use port 443 ? is it mandatory ? (I didn't use ssl for this)

If i curl this url, response like below.

Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: " to save to a file.

I know that the page is transferred as a binary in http2. I want get the nginx index page as a response.

your help will be really appreciated.

Pubudu Jayasanka
  • 1,294
  • 4
  • 18
  • 34

2 Answers2

3

Curl does not support HTTP/2 over HTTP (h2c) directly and insists on the upgrade method as detailed in this post:

Over an http:// URL If CURLOPT_HTTP_VERSION is set to CURL_HTTP_VERSION_2_0, libcurl will include an upgrade header in the initial request to the host to allow upgrading to HTTP/2. Possibly we can later introduce an option that will cause libcurl to fail if not possible to upgrade. Possibly we introduce an option that makes libcurl use HTTP/2 at once over http://

Nginx does not support HTTP/2 and HTTP/1 over the same clear text channel (see this enhancement request) hence it does not work with curl.

You can try using nghttp2 or h2c instead of curl but not sure if that works though not sure if they do. The reality is HTTP/2 is best negotiated over HTTPS and many tools (including all the browsers) only use HTTP/2 over HTTPS because of this.

Barry Pollard
  • 40,655
  • 7
  • 76
  • 92
  • Thank for your help. I installed curl with http2 support. I followed this link to enable http2 support https://askubuntu.com/questions/884899/how-do-i-install-curl-with-http2-support – Pubudu Jayasanka Jun 04 '18 at 09:39
  • OK I assumed you had Curl with http2 support, however even with that it won’t work without HTTPS. – Barry Pollard Jun 04 '18 at 09:43
2

I have found the solution for this. It is needed to enable SSL in nginx in order to achieve http2. I tried it and it's working well. I found the answer from this link.

How To Set Up Nginx with HTTP/2 Support on Ubuntu 16.04

Now my config file as below.

server {
listen       443 ssl http2;
server_name  localhost;

ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;


#charset koi8-r;
#access_log  /var/log/nginx/host.access.log  main;

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}
}
Pubudu Jayasanka
  • 1,294
  • 4
  • 18
  • 34