- 虚拟主机
概念:host 主机头
网站访问过程: 域名 --> DNS解析 --> 服务器IP --> web server(Nginx) --> 域名:端口 --> nginx.conf --> 虚拟主机 --> port --> server_name
配置文件结构:
nginx.conf
#user nobody;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
#server {
# ......
#}
#server {
# ......
#}
include vhosts/*.conf;
}
虚拟主机就是每一个 server { } 配置段
配置示例:
mkdir /usr/local/nginx/conf/vhosts
vi /usr/local/nginx/conf/vhosts/123.conf #内容如下
server {
listen 8080;
server_name www.123.com;
error_log /usr/local/nginx/logs/123_com crit;
access_log /usr/local/nginx/logs/123_com/access.log main;
location / {
root /tmp/123.com;
index index.html index.htm;
}
}
默认虚拟主机
任何域名解析过来,都会访问到那个虚拟主机里,就是默认虚拟主机,相同端口的第一个虚拟主机为默认虚拟主机,还可以手动配置 default_server
listen 80 default_server;
安全考虑,默认虚拟主机禁止访问,增加配置
deny all;
日志配置
错误日志 error_log
配置参数格式:error_log /path/to/log level;
Nginx错误日志级别
常见的错误日志级别有debug | info | notice | warn | error | crit | alert | emerg
级别越高记录的信息越少,如果不定义,默认级别为error.
它可以配置在main、http、server、location段里。
如果在配置文件中定义了两个error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个error_log。
但是,在不同的配置段中出现是没问题的。
Nginx错误日志示例
error_log /var/log/nginx/error.log crit;
如果要想彻底关闭error_log,需要这样配置
error_log /dev/null;
访问日志 access_log
示例1 获取用户真实IP
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
示例2
log_format main '$remote_addr [$time_local] '
'$host "$request_uri" $status "$request"'
'"$http_referer" "$http_user_agent" "$request_time"';
若不配置log_format或者不在access_log配置中指定log_format,则默认格式为:
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent";
| 变量 | 说明 |
|---|---|
| $remote_addr | 客户端(用户)IP地址 |
| $status | 请求状态码,如200,404,301,302等 |
| $request | 请求方式(GET或者POST等)+URL(包含host,$request_uri) |
| $http_user_agent | 用户浏览器标识 |
| $http_host | 请求的url地址(目标url地址)的host |
| $host | 等同于$http_host |
| $http_referer | 来源页面,即从哪个页面转到本页,如果直接在浏览器输入网址来访问,则referer为空 |
| $uri | 请求中的当前URI(不带请求参数,参数位于request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。 |
| $document_uri | 等同于$uri |
| $request_uri | 比uri+$args |
| $http_x_forwarded_for | 如果使用了代理,这个参数会记录代理服务器的ip和客户端的ip |
日志切割
在/etc/logrotate.d/下创建nginx文件,内容为:
vim nginx
/usr/local/nginx/logs/*log {
daily
rotate 30
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null
endscript
}
执行命令查看配置的日志切割文件是否正常
logrotate -f /etc/logrotate.d/nginx
说明:
- nginx日志在/data/logs/目录下面,日志名字以log结尾
2) daily表示每天切割
3) rotate 30表示日志保留30天
4) missingok表示忽略错误
5) notifempty表示如果日志为空,不切割
6) compress表示压缩
7) sharedscripts和endscript中间可以引用系统的命令
8) postrotate表示当切割之后要执行的命令
SSL配置
如果你自己有域名,去申请一个免费的ssl证书 freessl.cn
配置:
listen 443 ssl;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL;
ssl_prefer_server_ciphers on;
443端口为ssl监听端口。
ssl on表示打开ssl支持。
ssl_certificate指定crt文件所在路径,如果写相对路径,必须把该文件和nginx.conf文件放到一个目录下。
ssl_certificate_key指定key文件所在路径。
ssl_protocols指定SSL协议。
ssl_ciphers配置ssl加密算法,多个算法用:分隔,ALL表示全部算法,!表示不启用该算法,+表示将该算法排到最后面去。
ssl_prefer_server_ciphers 如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时,服务器加密算法将优于客户端加密算法。
反向代理
- PC访问web服务,并不知道访问的是代理服务器,PC以为代理服务器就是web服务器。
- 代理服务器将web服务器页面缓存到本地,当PC访问时直接反馈给PC页面
场景1:
域名没有备案,可以把域名解析到香港一台云主机上,在香港云主机做个代理,而网站数据是在大陆的服务器上。
示例1:
server
{
listen 80;
server_name 123.com;
location /
{
proxy_pass http://123.23.13.11/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
记录真实用户IP信息
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log combined_realip;
负载均衡
upstream www {
server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s;
server 172.37.150.101:80 weight=100;
server 172.37.150.110:80 down;
server 172.37.150.112:80 backup;
}
server
{
listen 80;
server_name www.123.com; ###域名
location / {
proxy_pass http://www/; ###上面upstream定义的www模块
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
说明:down,表示当前的server不参与负载均衡;
weight:权重,数值越高权重越高,访问的连接越多
backup:为预留的机器,当其他的server(非backup)出现故障或者忙的时候,才会请求backup机器;
max_fails:允许请求失败的次数,默认为1。当失败次数达到该值,就认为该机器down掉了。 失败的指标是由proxy_next_upstream模块定义,其中404状态码不认为是失败。
fail_timeount:定义失败的超时时间,也就是说在该时间段内达到max_fails,才算真正的失败。默认是10秒。