这里是我的设置: – 我有一个HTTP服务器在nodejs中实现,暴露API端点。 这是反向代理通过api.domain.com与SSL的api.domain.com 。 这是con@R_502_6408@uration:
1 server { 2 listen 80; 3 server_name api.domain.com; 4 access_log /var/log/Nginx/api.access.log; 5 location / { 6 proxy_pass http://127.0.0.1:3000/; 7 } 8 } 9 10 server { 11 listen 443; 12 server_name api.domain.com; 13 access_log /var/log/Nginx/api.access.log; 14 ssl on; 15 ssl_certificate /path/to/ssl/server.crt; 16 ssl_certificate_key /path/to/ssl/server.key; 17 location / { 18 proxy_pass https://127.0.0.1:3001/; 19 } 20 }
然后我有Nginx在dashboard.domain.com下面提供一个静态的上下文文件,用来从api.domain.com上使用api。 这是设置:
1 server { 2 listen 80; 3 server_name dashboard.domain.com; 4 root /path/to/static/site; 5 }
我想用CORS来做这件事,我确保静态站点上的js在所有的请求中发送正确的Origin头部。 我实现了一个非常简单的login机制。 以下是我在api端点上使用的咖啡代码:
# server.coffee app.con@R_502_6408@ure -> app.use middleware.setP3PHeader() app.use express.bodyParser() app.use express.cookieParser() app.use express.session secret: conf.session.secret key: conf.session.key cookie: maxAge: conf.session.maxAge app.use express.methodoverride() app.use express.query() app.use express.errorHandler() # routes.coffee app.options '*',shop.cors,shop.options app.post '/login',shop.login app.post '/logout',shop.logout app.get '/current-user',shop.current # shop.coffee exports.options = (req,res) -> res.send 200 exports.cors = (req,res,next) -> allowed = ['http://dashboard.domain.com','http://localhost:3000'] origin = req.get 'Origin' if origin? and origin in allowed res.set 'Access-Control-Allow-Origin',origin res.set 'Access-Control-Allow-Credentials',true res.set 'Access-Control-Allow-Methods','GET,POST' res.set 'Access-Control-Allow-Headers','X-Requested-With,Content-Type' next() else res.send 403,"Not allowed for #{origin}" exports.login = (req,res) -> unless req.body.email? and req.body.password? res.send 400,"Request params not correct #{req.body}" models.Shop.findOne() .where('email').equals(req.body.email) .where('password').equals(req.body.password) .exec (err,shop) -> if err? then return res.send 500,err.message unless shop? then return res.send 401,"Not found for #{req.body}" req.session.shopId = shop.id res.send 200,shop.publish() exports.logout = (req,res) -> delete req.session.shopId res.send 200 exports.current = (req,res) -> unless req.session.shopId? return res.send 401,"Not logged in!" models.Shop.findById(req.session.shopId) .exec (err,shop) -> if err? then return send.res 500,err.message unless shop? then return res.send 404,"No shop for #{req.session.shopId}" res.send 200,shop.publish()
问题是这样的:1.我第一次打电话给/login ,我得到一个新的会话与login用户( req.session.shopId )2.然后我打电话/current-user但会话不见了! 由nodejs服务器接收的会话ID是不同的,因此它创build了一个不同的会话
Nginx前面的Kibana没有使用“_plugin / kibana /”URI
Nginx:“server”指令在这里是不允许在/etc/Nginx/Nginx.conf:98
需要帮助build立:Apache反向代理
带有dynamic主机名的Apache ProxyPass
上游超时错误在Nginx + socket.io +代理+ ssl
Nginxcaching,但立即过期/重新确认使用`caching控制:公共,s-maxage = 0`
Nginx反向代理:很多html状态代码400响应,为什么?
看起来你有一个全局代理指令( proxy_pass ),但是你没有明确地处理头部转发(大概这个会话标记作为一个cookie存在),而且你还需要考虑什么构成了(共享的)会话缓存键。
可能会尝试这样的事情:
location / { proxy_pass http://127.0.0.1:3000/; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; proxy_http_version 1.1; proxy_cache pcache; proxy_cache_key "$scheme$host$request_method$request_uri"; }
此外,如果node.js服务器在同一个盒子上,不知道为什么你要通过本地主机( proxy_pass https://127.0.0.1:3001/ )上的SSL连接。 您可能需要考虑使用rewrite伪指令公开一个仅限SSL的公共面孔: rewrite ^ https://api.domain.com$request_uri? permanent; rewrite ^ https://api.domain.com$request_uri? permanent;
另请参阅: Node.js + Nginx – 现在是什么? [基本设置]和http://www.ruby-forum.com/topic/4408747关于从Nginx反向代理配置snafu丢失(和更糟 – 泄露!)会话的讨论。
如果您想拥有会话持久性,则需要确保正确配置了express-session模块。 saveUninitialized和saveUninitialized参数是重要的。
从文档:
重新保存
强制会话保存回会话存储区,即使请求期间会话永远不会被修改。 根据您的商店,这可能是必要的,但它也可以创建竞争条件,其中一个客户端向您的服务器发出两个并行请求,并且一个请求中的会话更改可能在另一个请求结束时被覆盖,即使它没有改变(这种行为也取决于你正在使用的商店)。
默认值为true,但使用默认值已被弃用,因为默认值将在以后更改。 请研究这个设置,并选择适合您的用例。 通常情况下,你会想要假。
我怎么知道这是否是我的商店所必需的? 最好的方法是检查你的商店,如果它实现了触摸方法。 如果是这样,那么你可以安全地设置resave:false。 如果它没有实现触摸方法,并且商店在存储的会话上设置了到期日期,那么您可能需要resave:true。
saveUninitialized
强制将“未初始化”的会话保存到商店。 会话在新建但未修改时未初始化。 选择false对于实现登录会话,降低服务器存储使用率或在设置cookie之前遵守需要许可的法律很有用。 选择错误也有助于客户在没有会话的情况下进行多个并行请求的竞争条件。
默认值为true,但使用默认值已被弃用,因为默认值将在以后更改。 请研究这个设置,并选择适合您的用例。
注意,如果您将Session与PassportJS结合使用,则Passport将在会话中添加一个空的Passport对象,以供用户验证之后使用,这将作为会话的修改处理,从而导致将其保存起来。
我的一个应用程序有这个,它的工作:
app.use(session({ store: new RedisStore({ host: con@R_502[email protected]dis_instance_local_ip,port: con@R_502[email protected]dis_instance_local_port }),secret: con@R_502[email protected]_session_secret,resave: false,saveUninitialized: true }));
另外,如果你想通过Nginx对多个节点进行负载均衡的粘性会话(或会话持久化),你应该有Nginx的商业版本,Nginx plus。 请参阅http://Nginx.com/products/session-persistence/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。