Nginx使用记录
配置常见解释:
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody。
worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址,默认存在logs/nginx.pid
error_log logs/error.log error; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$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 myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
#sendfile_max_chunk 0; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#upstream mysvr { #服务器列表,用于负载均衡等
#server 127.0.0.1:7878;
#server 192.168.10.121:3333 backup; #热备
#}
#gzip on;
server {
listen 80;
server_name www.aaa.con aaa.con; #多个站点使用空格隔开
location / {
proxy_pass http://www.aaa.con:8087/proj1/;
}
location /proj1/ {
proxy_pass http://www.aaa.con:8087/proj1/;
}
}
server { listen 80; server_name www.bbb.con bbb.con; location / { proxy_pass http://www.aaa.con:8087/proj2/; } location /proj2/ { proxy_pass http://www.aaa.con:8087/proj2/;
}
}
}
注意:以上80端口可以映射到两个地址,多个地址也一样。
这段配置的意思是访问www.aaa.com或者aaa.com的请求,会被nginx映射到http://www.aaa.con:8087/proj1/;而访问www.bbb.com或者bbb.com的请求,会被映射到http://www.aaa.con:8087/proj2/。多配置location /proj1/的原因是避免CSS/js等在html中设置了项目名路径的资源因为nginx的反向代理造成丢失工程名而无法访问到资源。
这样,我们就能够在一台机器上发布针对若干个域名的WEB服务了。
注:有些应用必须设置proxy_set_header属性,否则无法正常使用(比如使用dwr框架的javaee应用),示例:
server {
listen 80;
server_name *.a.com;
location / {
proxy_pass http://localhost:8080/projectA/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
原因如下:
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。 Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。 同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头: proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr; 这里的$http_host和$remote_addr都是nginx的导出变量,可以再配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。
使用rewrite可以将80端口映射到443去
#80 rewrite to 443
server {
listen 80; #监听的端口
server_name xxx.ttt.com; #监听的域名,多个使用空格隔开
rewrite ^(.*) https://$server_name$1 permanent; #80映射到443端口
}
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate xxx.ttt.com_bundle.crt;
ssl_certificate_key xxx.ttt.com.key;
ssl_session_timeout 20m;
#ssl_protocols SSLv3 TLSv1;
#ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://xxx.ttt.com;
}
安装为Windows 服务:
需使用开源的winsw工具https://github.com/kohsuke/winsw,下载对应的winsw。
注意:安装不成功的时候,可能是由于没有安装.net framework.
参照:http://www.cnblogs.com/edisonchou/p/4126742.html
(4)每次以cmd方式启动Nginx服务不符合实际要求,于是我们想到将其注册为Windows服务,并设置为自动启动模式。这里,我们使用一个不错的小程序:“Windows Service Wrapper”,将nginx.exe注册为Windows服务,具体的步凑如下:
①下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 "winsw-1.8-bin.exe"(本文底部有下载地址),然后把它命名成你想要的名字(比如: "nginx-service.exe",当然,你也可以不改名)
②将重命名后的 nginx-service.exe 复制到 nginx 的安装目录(比如,我这里是 "D:\Servers\nginx-1.4.7")
③在同一个目录下创建一个Windows Service Wrapper 的XML配置文件,名称必须与第一步重命名时使用的名称一致(比如我这里是 "nginx-service.xml", 如果,你没有重命名,则应该是 "winsw-1.8-bin.xml"),这个XML的内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <service> <id>nginx</id> <name>Nginx Service</name> <description>High Performance Nginx Service</description> <executable>D:\Servers\nginx-1.4.7\nginx.exe</executable> <logpath>D:\Servers\nginx-1.4.7\</logpath> <logmode>roll</logmode> <depend></depend> <startargument>-p D:\Servers\nginx-1.4.7</startargument> <stopargument>-p D:\Servers\nginx-1.4.7 -s stop</stopargument> </service>
④在命令行下执行以下命令,以便将其注册成Windows服务:nginx-service.exe install
⑤接下来就可以在Windows服务列表看到Nginx服务了,这里我们可以将其设置为自动启动了:
(5)总结:在Windows环境中,要对外提供的Windows服务一般都要将其启动类型设置为自动。