programing

운영 환경에서 MemoryStore 사용

i4 2023. 7. 30. 17:03
반응형

운영 환경에서 MemoryStore 사용

오늘 처음으로 "운영" 모드에서 Node.js 애플리케이션을 실행했는데 다음과 같은 경고가 표시되었습니다.

Warning: connection.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and obviously only work within a single process.

프로세스를 하나만 실행하면 되는데, 대신 무엇을 사용해야 합니까?빠른 액세스를 위해 세션을 RAM에 저장합니다.또한 노드 앱을 종료하는 것만으로 모든 세션을 폐기할 수 있기를 원합니다.

이 간단한 작업만을 위해 Redis, MongoDB 또는 다른 데이터베이스를 설치하는 것은 지나친 일인 것 같습니다.저는 또한 메모리 스토어가 실제로 사용되어서는 안 되는데 왜 노드에 포함되어 있는지 이해할 수 없습니다.

네, 커넥트 개발자들과 얘기해보니 더 많은 정보를 얻었습니다.여기에는 메모리 누수로 간주되는 두 가지가 있습니다.

  1. 최근 버전에서 이미 수정된 JSON 구문 분석 문제
  2. 사용자가 세션에 액세스하지 않는 경우 만료된 세션에 대한 정리가 없다는 사실(즉, 유일한 정리는 온액세스)

해결책은 매우 간단한 것 같습니다. 적어도 이것이 제가 계획한 것입니다. setInterval을 사용하여 만료된 세션을 주기적으로 정리하는 것입니다.MemoryStore는 목록을 가져오기 위해 all()을 제공하며 get()을 사용하여 강제로 읽어서 만료시킬 수 있습니다.유사 코드:

function sessionCleanup() {
    sessionStore.all(function(err, sessions) {
        for (var i = 0; i < sessions.length; i++) {
            sessionStore.get(sessions[i], function() {} );
        }
    });
}

이제 setInterval()을 통해 sessionCleanup을 주기적으로 호출하면 만료된 세션에 대한 가비지 수집이 자동으로 수행됩니다.더 이상 메모리 누수가 없습니다.

그래서 이에 대한 허용된 대답은 [edit: was] 거의 해킹이었고, 다른 사람들은 제가 생각하기에 과잉 살상이라고 생각하는 데이터베이스를 사용할 것을 권장하고 있습니다.

저도 같은 문제가 있었고 방금 express-session을 cookie-session으로 대체했습니다.

을 수행하려면 를 하십시오.cookie-session:

npm install cookie-session

당신의 럼그당의에서.app.js장소를 찾아내다express-session 를 사용중 대합체니다다로음으로 합니다.cookie-session.

app.use(require('cookie-session')({
    // Cookie config, take a look at the docs...
}));

당신은 다른 것들을 바꿔야 할지도 모릅니다. 왜냐하면 저는 간단한 밥 교환을 했습니다. 당신의 삼촌은 아무 해가 없습니다.

MemoryStore는 앱을 다시 시작하면(프로세스가 중지됨) 해당 프로세스의 메모리에 상주하는 모든 세션 데이터가 손실되기 때문에 (빠른) 개발 모드를 위한 것입니다.

데이터베이스를 사용하지 않으려면 암호화된 쿠키 저장소를 대신 사용합니다.

http://www.senchalabs.org/connect/cookieSession.html

이 모듈은 메모리 누수 문제를 해결하기 위해 설계되었습니다.https://www.npmjs.com/package/session-memory-store

승인된 답변은 괜찮을 수 있습니다.하지만 이 질문이 검색 결과 목록에 높게 표시되기 때문에 다른 사람에게 도움이 될 경우를 대비해 이 질문을 포함하기로 했습니다.

제 생각에 웹상의 의견 일치는 그것을 위해 DB를 사용하는 것이 옳은 방법이라는 것입니다. 하지만 만약 여러분이 그렇게 하고 싶지 않다면, 경고를 억제하세요. 경고는 법이 아닙니다.

하지만, 여러분과 저 모두 메모리 누수가 진짜 문제라는 것에 동의하기 때문에, redis가 과잉 살상이라고 말하는 것은 정당화하기 어렵습니다. 왜냐하면 그것은 여러분의 문제를 해결할 것이기 때문입니다.

실제로 사용해서는 안 되는데 왜 MemoryStore가 노드에 포함되어 있는지도 이해할 수 없습니다.

그것은 좋은 점입니다. 하지만 노드 자체가 최근에야 생산 준비가 되었다고 말하고 싶습니다.어떤 사람들은 그것이 사실이라는 생각에 전혀 동의하지 않을 것입니다.

대안은 Redis 또는 Mongo를 상점으로 사용하는 것입니다.Mongo에서는 express-session-mongo 모듈을 사용합니다.

인덱싱 옵션을 사용하여 오래된 세션을 제거하는 것이 좋습니다.

var MongoStore = require('express-session-mongo');
app.use(express.session({ store: new MongoStore() }));

db.sessions.ensureIndex( { "lastAccess": 1 }, { expireAfterSeconds: 3600 } )

오래된 세션은 데이터베이스 자체에서 제거되므로 Express 세션이 직접 정리를 처리할 필요가 없습니다.

편집: "마지막 액세스" 필드가 필요한 것 같습니다.액세스할 때 해당 필드를 직접 업데이트합니다.MongoDB 설명서 expire-data http://docs.mongodb.org/manual/tutorial/expire-data/ 를 확인합니다.

EDIT2:

은 지은금이 됩니다.db.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

이 필드를 확인하는 Mongo 백그라운드 스레드는 60초마다 실행됩니다.그래서 문서를 제거하는 시기가 정확하지 않습니다.

Redis와 문제가 있는 사람들을 위해 다음을 시도하세요 - 이것이 도움이 되기를 바랍니다.

저는 Redis를 DEV와 PROD용으로 사용하고 있으며 Express v4를 타겟으로 하고 있습니다.Windows에서는 경량 MSOpenTech Redis v3.0 도구 세트를 사용하고 있으며, 그렇지 않으면 Heroku Redis Addon을 사용합니다.노드를 통해 작업하는 것은 그리 어렵지 않았습니다. 지금까지는...

var session = require('express-session');

. . .

var RedisStore = require('connect-redis')(session);

var redisClient = require('redis').createClient(process.env.REDIS_URL);

var redisOptions = { 
        client: redisClient, 
        no_ready_check: true,
        ttl: 600,
        logErrors: true
};

var redisSessionStore = new RedisStore(redisOptions);

app.use(session({
    store: redisSessionStore,
    secret: 'Some.Long.Series.of.Crazy.Words.and.Jumbled.letter.etc',
    resave: true,       
    saveUninitialized: true 
}));

행운을 빕니다.

ps. 나는 방금 원래 쿼리를 다시 읽었고 이것을 알아차렸습니다 - 죄송합니다!

이 간단한 작업만을 위해 Redis, MongoDB 또는 다른 데이터베이스를 설치하는 것은 지나친 일인 것 같습니다.

OSX를 사용하는 경우

brew install memcached

리눅스의 경우

apt install memcached

디앱이 127.0.0.1:11211 memcache 서비스에 연결할 수 있기 때문에 세션 메시지를 해결합니다.

사용하다

import createMemoryStore from "memorystore";
...
// Memory store
const MemoryStore = createMemoryStore(session);
app.use(session({
    ...
    store: new MemoryStore({
        checkPeriod: 86400000 // prune expired entries every 24h
    }),
    ...
}))

내 경우 문제 해결

언급URL : https://stackoverflow.com/questions/10760620/using-memorystore-in-production

반응형