安装nginx你可能已经通过apt-getyum等命令安装好了,但可能不支持httpshttp2ipv6等功能。查看当前版本配置,我们可以使用nginx-V命令查看版本和支持的配置。下面以ubuntu为例,卸载安装nginxUninstall#移除nginx$apt-get--purgeremovinginx#查询nginx依赖的包,会列出$dpkg--get-selections|grepnginx#移除列出的包上面,比如nginx-common$apt-get--purgeremovenginx-common#也可以执行autoremove,会自动删除不需要的包$apt-getautoremove#查询nginx相关的文件并删除。$sudofind/-namenginx*安装依赖库#gccg++apt-getinstallbuild-essentialapt-getinstalllibtool#pcresudoapt-getinstalllibpcre3libpcre3-dev#zlibapt-getinstallzlib1g-dev#sslapt-getinstallopensslapt-getinstalllibssl-dev安装nginx在nginx下载上找到最新的nginx版本#下载$wgethttps://nginx.org/download/nginx-1.17.8.tar.gz#解压$tar-zxvfnginx-1.17.8.tar.gz#进入目录$cdnginx-1.17.8#Configuration,一个这里可能会报错,如果有什么遗漏,就Whattoinstall$./configure--prefix=/usr/local/nginx\--with-http_gzip_static_module\--with-http_v2_module\--with-pcre\--with-http_ssl_module#编译,这里可能会报错,缺少安装什么$make#安装$makeinstall#通过软连接,可以直接使用nginx执行sudoln-s/usr/local/nginx/sbin/nginx/usr/bin/nginxSSLcertificateSSL证书一般需要购买,也有免费的,由第三方SSL证书颁发机构颁发。也可以在云服务商上购买,但一般免费的ssl证书只能支持单个域名。这里推荐Let'sEncrypt组织,然后使用acme.sh从letsencrypt生成免费证书,可以生成通配符域名证书。参考acme.sh中文wiki,使用acme.sh部署Let'sEncrypt实现泛域域名通过阿里云DNS验证。HTTPS上面两篇文章讲的很详细,不再赘述。PS:推荐使用DNS验证--dnsdns_ali是根据不同的服务商,dns_ali指的是阿里云。请参阅如何使用其他服务提供商的DNSAPI。证书生成后默认在~/.acme.sh/目录下。这里的文件是内部使用的。您需要使用--installcert命令指定目标位置。这里,把证书放在nginx的conf目录下。.../conf/ssl/...confighttphttp基本配置http配置很简单,配置如下,我们先让网站可以访问。server{listen80;server_namewangsijie.topwww.wangsijie.top;location/{root/var/www/main;indexindex.html;}}使用http://访问,会显示配置httpshttps基本配置server{listen443ssl;server_namewangsijie.topwww.wangsijie.top;#证书文件,这里使用fullchain.cer通过acme.sh生成的泛域证书ssl_certificatessl/fullchain.cer;#私钥文件ssl_certificate_keyssl/wangsijie.top.key;location/{root/var/www/main;indexindex.html;}}重启后,访问你的https://开头的网站,你会发现http配置已经修改了,但是用http://访问时仍然显示连接不安全,我们需要修改配置,当访问http时,会重定向到https如下http://访问,会重定向到https://PS:网上也有很多使用rewrite的重定向,但是返回命令简单高效。推荐使用return完全配置server{listen80;server_namewangsijie.topwww.wangsijie.top;return301https://$server_name$request_uri;}server{listen443ssl;server_namewangsijie.topwww.wangsijie.top;ssl_certificatessl/fullchain.cer;ssl_certificate_keyssl/wangsijie.top.key;location/{root/var/www/main;indexindex.html;}}混合配置服务器{listen80;listen443ssl;server_namewangsijie.topwww.wangsijie.top;ssl_certificatessl/fullchain.cer;ssl_certificate_keyssl/wangsijie.top.key;location/{root/var/www/main;index.html;}}https安全加密套件https默认为SHA-1算法,非常脆弱我们可以使用Diffie-Hellman密钥交换。我们在/conf/ssl目录下生成dhparam.pem文件openssldhparam-outdhparam.pem2048。下面的指令ssl_protocols和ssl_ciphers用于限制连接只包含SSL/TLS的增强版本和算法。#优先服务器算法ssl_prefer_server_cipherson;#使用DH文件ssl_dhparamssl/dhparam.pem;#协议版本ssl_protocolsTLSv1TLSv1.1TLSv1.2;#定义算法ssl_ciphersEECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH:+AES25:+AES253DES:RSA+3DES:!MD5;复制代码安全响应标头#启用HSTS。允许https网站要求浏览器始终通过https访问add_headerStrict-Transport-Security"max-age=31536000;includeSubDomains;preload"always;#减少点击劫持add_headerX-Frame-OptionsDENY;#禁止服务器自动解析资源类型add_headerX-Content-Type-Optionsnosniff;#防XSS攻击add_headerX-Xss-Protection1;复制代码服务器优化#配置共享会话缓存大小ssl_session_cacheshared:SSL:10m;#配置会话超时ssl_session_timeout10m;复制代码http2配置http2的配置很简单,只要后面添加http2即可。下面的[::]:表示ipv6的配置,不需要加上listen80;listen[::]:80;listen443sslhttp2;listen[::]:443sslhttp2;重启nginx后,就可以使用本站的工具了。keycdn.com/http2-test测试http2是否配置成功。最后完成配置server{listen80;listen[::]:80;listen443sslhttp2;listen[::]:443sslhttp2;server_namewangsijie.topwww.wangsijie.top;ssl_certificatessl/fullchain.cer;ssl_certificate_keyssl/wangsijie.top.key;ssl_session_cacheshared:SSL:10m;ssl_session_timeout10m;ssl_prefer_server_cipherson;ssl_dhparamssl/dhparam.pem;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_ciphersEECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES!add_headerStrict-Transport-Security"max-age=31536000;includeSubDomains;preload"always;add_headerX-Frame-OptionsDENY;add_headerX-Content-Type-Optionsnosniff;add_headerX-Xss-Protection1;location/{root/var/www/main;indexindex.html;}}配置文件优化为了让更多的二级域名支持以上功能,每个服务器都这样写,太麻烦了。可以把listen443、ssl、add_header写在一个单独的文件里,然后用inculde命令。如下:其他配置放在conf.d/https-base.confserver{listen8099;listen[::]:8099;server_nametest.wangsijie.top;includeconf.d/https-base.conf;location/{root/var/www/test;indexindex.html;}}
