Nginx 初学者实践
1. Nginx 配置编排
对于 Nginx初学者(比如我)来说,习惯了在
nginx.conf
的文件中直接写配置文件。这样会让所有的配置都混在一起,非常不好管理
Nginx推荐的配置编排方式
在ubuntu中装好 Nginx 之后,目录结构如下
推荐配置编排方式
1. nginx.conf
这个 Nginx 的默认配置文件。建议用来保存全局的配置。
例如:全局限制下载文件大小设置
2. sites-available
这是一个配置目录。建议用来保存对应域名的配置。
例如,我有一台机器和3个域名(分别是mkii.com, dev.mkii.com, test.mkii.com)。在 sites-available目录下新建3个文件:
mkii.com:用来写关于 mkii.com 这个域名的配置
dev.mkii.com:用来写关于 dev.mkii.com 这个域名的配置
test.mkii.com:用来写关于 test.mkii.com 这个域名的配置
注意 sites-available 目录中文件默认是不生效的,sites-enabled 目录中的文件才会生效
3. sites-enabled
这是一个配置目录。建议用来保存是否开启 sites-available 目录中的配置。通过link的方式决定配置是否生效。
例如:开启dev.mkii.com的配置
cd /etc/nginx/sites-enabled
# 在sites-enabled目录中生成一个文件dev.mkii.com并link到sites-available目录下的dev.mkii.com
link ../sites-available/dev.mkii.com dev.mkii.com
2. 常用配置
2.1 将 80 的请求全部转到 443 端口
server {
listen 80;
server_name mkii.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
2.2 配置网站证书
server {
listen 443 ssl http2;
server_name mkii.com;
keepalive_timeout 60;
keepalive_requests 100;
ssl_certificate /etc/nginx/ssl/mkii.com.cert.pem;
ssl_certificate_key /etc/nginx/ssl/mkii.com.key.pem;
ssl_session_timeout 30m;
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!MD5:!ADH:!RC4:!DH:!DHE;
gzip on;
gzip_comp_level 5;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml image/jpeg image/gif image/png;
# 我的网站目录
location / {
root /opt/site;
index index.html;
}
# 我的网站文件目录。访问https://mkii.com/files/xxx 会到/opt/site-files目录下找文件
location /files/ {
root /opt/site-files;
}
}
申请证书的时候有2种方式验证服务器:
- 通过dns验证
- 通过在服务器上放一个文件来验证
关于文件验证可以看我的另一篇文章:域名的https证书申请并自动续期
这个的配置主要是为了第2种方式验证,我不想把验证文件放在我的网站的目录里边,所以我使用 Nginx 切换验证文件的位置。
访问 http://mkii.com/.well-known/acme-challenge/agww2B-ty–atKNEn_2tfTB32US0mNfoeahd3DpA8F4,会去到/opt/ssl-auth找.well-known/acme-challenge/agww2B-ty–atKNEn_2tfTB32US0mNfoeahd3DpA8F4
# ^~表示匹配以/.well-known/acme-challenge/开头的请求。用于自动生成证书
location ^~ /.well-known/acme-challenge/ {
root /opt/ssl-auth/;
}
2.3 配置 / 和 /admin/ 的请求走都走/admin/
我的网站本来发布在 https://dev.mkii.com/admin/,现在我想用一个域名做统一的入口。也就是说直接访问我的域名 https://dev.mkii.com 就能进入我的网站
location / {
proxy_pass http://127.0.0.1:8080/admin/;
}
location /userportal/ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1:8080/admin/;
}
这个有个细节:proxy_pass 后面是否加 / 会有比较大的不同。可以参考这篇文章:nginx 之 proxy_pass详解
2.4 配置端口证书
server {
listen 443 ssl;
server_name mkii.com:8080;
ssl_certificate /etc/nginx/ssl/mkii.com.cert.pem;
ssl_certificate_key /etc/nginx/ssl/mkii.com.key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 这里把请求透传到了内部
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8088/;
proxy_redirect off;
}
}