Nginx安装配置备忘
原文链接 http://menglei.tk/2016/10/21/nginx/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
Nginx是一个俄罗斯开发的高性能HTTP服务器和反向代理服务器,功能丰富、性能强悍、运行稳定、应用广泛,完全使用C语言编写,可运行于各种Unix Like OS,并有Windows移植版本(不推荐用于生产环境)。
安装
在Ubuntu中,可以直接使用sudo apt-get install nginx
命令安装nginx,安装之后,默认的配置文件保存在 /etc/nginx
文件夹内,默认提供http服务的目录位置在 /usr/local/nginx/html
。
配置
nginx的主配置文件是:nginx.conf
user www-data; #用户与用户组
worker_processes 4; #对外提供服务的worker进程数量,取值取决因素包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。默认可设置为CPU内核数或者可设置为“auto”。
worker_rlimit_nofile 30000; #worker进程最大打开文件数量限制
pid /var/run/nginx.pid; #pid文件保存位置
events {
worker_connections 10000; #单个worker可以最大打开的连接数
# multi_accept on; #收到一个新连接通知后是否接受尽可能多的连接
}
http {
##
# Basic Settings
##
sendfile on; #sendfile特性,提高文件访问的效率
tcp_nopush on; #在一个tcp数据包里发送所有的头文件
tcp_nodelay on; #不要缓存数据,立即发送
keepalive_timeout 65; #客户端keep-alive连接的超时时间
types_hash_max_size 2048;
# server_tokens off; #是否关闭错误页面中的nginx版本显示
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types; #特定后缀使用mime types的配置
default_type application/octet-stream; #默认文件mime types
client_max_body_size 200m; #上传文件最大体积
##
# Logging Settings
##
access_log off; #访问日志记录文件路径
error_log /var/log/nginx/error.log; #错误日志记录文件
##
# Gzip Settings
##
gzip on; #是否启用gzip压缩(可减少流量,增大服务器负载)
gzip_disable "msie6"; #指定客户端禁用gzip
gzip_vary on;
gzip_proxied any; #允许或者禁止压缩基于请求和响应的响应流。设置为any,意味着将会压缩所有的请求。
gzip_comp_level 6; #压缩等级
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #设置需要压缩的数据格式
server{ #服务器配置
listen 80; #端口
server_name example.com; #域名
location / {
root /usr/local/nginx/html; #根目录
index index.html index.htm index.php; #默认主页文件
}
}
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf; #配置
include /etc/nginx/sites-enabled/*; #virutal host配置
}
virutal host 配置
nginx作为反向代理服务器,可以根据域名不同将用户的请求分发给不同的后端服务器,配置文件放置在site-available目录中,如果要启用某一个特定的配置文件,需要在site-enabled目录中建立一个对应的软连接。
我们想要配置一个api.example.com
的虚拟服务器,将特定/api路径下的所有请求转发到后端的api服务器,其他请求直接访问对应的静态文件目录,同时支持HTTP和HTTPS访问,配置如下
server {
server_name api.example.com; #域名,只有访问这个域名的请求才会被转发到这里
listen 80; #监听端口
listen 443 ssl; #HTTPS监听端口
ssl on; #是否启用HTTPS
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; #HTTPS证书公钥地址,此处为Let's Encrypt申请的证书
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; #HTTPS证书私钥地址,此处为Let's Encrypt申请的证书
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #HTTPS协议版本
ssl_prefer_server_ciphers on; #服务器加密优先于客户端加密
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; #加密算法
location ^~ /api/ { #所有匹配到/api路径下的访问,全部转发
proxy_pass http://127.0.0.1:8051/rest/;
proxy_set_header Host $http_host; #转发的请求,HOST取值为客户端访问的host值
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #增加x-Forwarded-for
proxy_set_header X-Real-IP $remote_addr; #增加x-real-ip,取值为访问用户的真实IP,供后端获取客户IP使用
}
location = /upload { #只有访问路径等于 /upload 的请求,才会转发到这里
proxy_pass http://127.0.0.1:8052/upload/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 200m; #设置最大上传文件体积,单位可以是k、m、g
}
location ~ /.well-known { #letsencrypt申请证书验证域名使用的配置目录
root /usr/share/nginx/.well-known;
index index.html;
}
location / { #所有不匹配上面各种条件的请求,都转发到这里
root /var/webroot;
index index.html index.htm;
}
}
将以上配置保存为 /etc/nginx/sites-available 目录中的 api.example 文件,然后进入site-enabled目录,执行 ln -s ../sites-available/api.example api.example
在sites-enabled中建立其对应的软连接,然后执行 service nginx reload
重新加载nginx的配置,即可生效。
nginx配置强制跳转HTTPS
很多网站都要求所有HTTP的访问都强制跳转到HTTPS,其配置方法有很多种,可以按照以下配置思路:
我们有一个仅支持HTTPS访问的配置好的virtual host:
server {
server_name www.example.com;
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location / {
root /var/webroot;
index index.htm index.html;
}
}
新建一个配置文件www.redirect:
server {
server_name www.example.com;
listen 80;
location ~ /.well-known { #letsencrypt申请证书验证域名使用的配置目录
root /usr/share/nginx/.well-known;
index index.html;
}
location / { #默认请求
root /noexists; #一个不存在的目录
index index.html;
}
error_page 404 https://www.example.com/; #访问文件不存在时,跳转的链接
}
在sites-enabled 目录中为以上配置文件设置一个软链接,然后reload nginx即可。
其思路主要是利用了nginx的404页面,我们为http server配置了一个不存在的路径,这样在访问http服务器的时候,其index.html文件是不存在的,这样nginx就会给用户返回特定的404 Not Found 页面,我们将对应的HTTPS链接指定为其对应的404页面,这样在访问http server的时候,就会被自动redirect到相应的HTTPS页面了。