#常用命令
nginx -t 测试配置是否正确
nginx -s reload 加载最新配置
nginx -s stop 立即停止
nginx -s quit 优雅停止
nginx -s reopen 重新打开日志
1.加密协议
(1)需要配置符合PFS规范的加密套餐,目前推荐配置:ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4
(2)用来指定所开启协议的版本,目前1.2是主流而且更高效。不安全的SSLv2 和 SSLv3 都要禁用。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
目前最新的TLS是1.3版本,不过目前也没有大范围使用,不过要支持TLS1.3,要使用openssl的1.1.1系列版本,所以要使用TLS1.3,升级openssl 并且在编译安装nginx的时候指定。
server {
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
2.Http升级为WebSocket
因为WebSocket协议是一个hop-by-hop协议(此类头部字段只对单次转发有效。会因为转发给缓存/代理服务器而失效),为了让Nginx代理服务器可以将来自客户端的Upgrade请求发送到后端服务器,要求Upgrade和Connection的头信息必须被显式的设置。可以通过下文将要讲解的修改Nginx的配置文件方式解决此问题。
代理服务器分别与客户端和服务器建立连接,由于WebSocket连接是长时间保持的,所以代理服务器需要允许这些连接处于打开状态,而不是像对待HTTP使用的短连接那样将其关闭。
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
2.主文件
http {
include mime.types;
#指定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,
#例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问php文件会出现下载窗口
default_type application/octet-stream;
#proxy_read_timeout连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 1200;
#proxy_connect_timeout 跟后端服务器连接超时时间(代理连接超时)
#proxy_connect_timeout 1200;
#proxy_send_timeout后端服务数据回传时间(代理发送超时)
#proxy_send_timeout 1200;
#通过单引号'连接日志格式,""[]都会出现在日志中
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $http_host "$http_x_forwarded_for"';
#日志文件位置
access_log /appdata/log/nginx/www.hnsyun.com main;
#是否调用sendfile函数输出文件,普通应用必须设on
sendfile on;
#ngx_http_limit_conn_module 模块,来限制连接数。那么请求数的限制该怎么做呢?这就需要通过
#ngx_http_limit_req_module 模块来实现,该模块可以通过定义的 键值来限制请求处理的频率
#区域名称为one,大小为10m,平均处理的请求频率不能超过每秒10次。
limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m rate=10r/s;
#设置你所希望的日志级别,当服务器因为频率过高拒绝或者延迟处理请求时可以记下相应级别的日志。
#延迟记录的日志级别比拒绝的低一个级别;比如, 如果设置“limit_req_log_level notice”,
#延迟的日志就是info级别。
limit_req_log_level notice;
#客户端对服务端的持续连接时间,避免频繁重新建立连接
keepalive_timeout 65;
upstream server_name {
}
server {
}
}
3.sticky模块(nginx-sticky-module-1.1.tar.gz)
upstream v3.yun.com{
server 192.168.112.70:8081 weight=1; #负载均衡
server 192.168.112.69:8081 weight=1;
sticky;
}
4.server部分的配置
server {
listen 19999 ssl; #监听端口
server_name v3.yun.com; #访问域名
ssl_certificate /app/nginx/conf/myapp.crt; #证书地址
ssl_certificate_key /app/nginx/conf/myapp.key;
ssl_session_timeout 50m; #session变量生存时间的50分钟
ssl_session_cache shared:SSL:1m; #会耗费一部分内存,1m可以同时保存4000个会话,10m理论支持4万个会话
ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on; #让服务器选择要使用的算法套件,这样避免客户端选择低安全的算法
location / {
proxy_pass http://222.17.216.20:8888; #请求转向服务器列表,可以实现负载均衡
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; #WebSocket
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $remote_addr;
proxy_read_timeout 86400; #控制proxy后端服务器之间的超时时间
}
5.HTTPS证书的申请与颁发
openssl genrsa - des3 - out server.key 1024
openssl req - new - key server.key - out server.csr
cp server.key server.key.bak
openssl rsa - in server.key.bak - out server.key
openssl x509 - req - days 10240 - in server.csr - signkey server.key - out server.crt
6.nginx重新编译添加ssl模块--with-http_ssl_module
找到安装nginx的源码根目录,如果没有的话下载新的源码
http://nginx.org
tar xvzf nginx-1.3.2.tar.gz
查看ngixn版本极其编译参数
/usr/local/nginx/sbin/nginx -V
进入nginx源码目录
cd nginx-1.3.2
以下是重新编译的代码和模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make 千万别make install,否则就覆盖安装了
make完之后在objs目录下就多了个nginx,这个就是新版本的程序了
备份旧的nginx程序
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
把新的nginx程序覆盖旧的
cp objs/nginx /usr/local/nginx/sbin/nginx
测试新的nginx程序是否正确
/usr/local/nginx/sbin/nginx -t
nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
平滑重启nginx
/usr/local/nginx/sbin/nginx -s reload
查看ngixn版本极其编译参数
/usr/local/nginx/sbin/nginx -V