CentOS에서 PostgreSQL을 yum을 사용하여 설치하는 방법은 다음과 같습니다:

먼저, root 사용자로 로그인합니다.

PostgreSQL 패키지를 설치하기 위해 EPEL 저장소를 활성화합니다. 다음 명령을 실행합니다:

sudo yum install epel-release

PostgreSQL 패키지를 설치합니다. 다음 명령을 실행합니다:

sudo yum install postgresql-server

PostgreSQL 데이터베이스 클러스터를 초기화합니다. 다음 명령을 실행합니다:

sudo postgresql-setup initdb

 

PostgreSQL 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다. 다음 명령을 실행합니다:

sudo systemctl start postgresql
sudo systemctl enable postgresql

PostgreSQL 서버에 액세스하기 위해 PostgreSQL 사용자 계정의 암호를 설정합니다. 다음 명령을 실행합니다:

sudo passwd postgres

PostgreSQL 사용자로 전환합니다. 다음 명령을 실행합니다:

su - postgres

PostgreSQL 콘솔에 접속합니다. 다음 명령을 실행합니다:

psql

 

 

1. Program.cs에서 프로세스의 진입점을 분기한다.

internal static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        static void Main(string[] args)
        {
            if (Environment.UserInteractive)
            {
                Console.WriteLine("콘솔");

                Service1 service1 = new Service1();
                service1.TestStartupAndStop(args);
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }

2. Service1.cs (이름 다를 수 있음)에 디버깅용 함수를 추가한다.

internal void TestStartupAndStop(string[] args)
{
    Console.WriteLine($"Service starting...");
    this.OnStart(args);
    Console.WriteLine($"Service started. Press any key to stop.");
    Console.ReadKey();
    Console.WriteLine($"Service stopping...");
    this.OnStop();
    Console.WriteLine($"Service stopped. Closing in 5 seconds.");
    System.Threading.Thread.Sleep(5000);
}

3. 빌드 & 명령어로 서비스 생성

서비스 생성

1) cmd를 관리자 권한으로 실행

2) InstallUtil.exe가 위치한 경로로 이동 : cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 

3) cmd에서 서비스 Install : InstallUtil.exe C:\\VisualStudio프로젝트경로\Service(서비스명).exe

 

4. 삭제

sc delete 서비스 명

 

추가로 서비스 명 설정 등 기본 프리셋은 ProjectInstaller.Designer.cs에서 아래와 같이 할 수있다.

private void InitializeComponent()
{
    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    // 
    // serviceProcessInstaller1
    // 
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    this.serviceProcessInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_AfterInstall);
    // 
    // serviceInstaller1
    // 
    this.serviceInstaller1.Description = "CNC Collector Installer";
    this.serviceInstaller1.DisplayName = "WinSvr.CNC.Collector";
    this.serviceInstaller1.ServiceName = "CNCCollector";
    // 
    // ProjectInstaller
    // 
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});

}

Flask로 웹서버를 임시로 기동하면

WARNING : This is a development server. Do not use it in a production deployment.

Use a production WSGI server instead.

라는 문구를 볼 수 있다.

 

개발환경과 같이 단 건의 요청을 처리하는데는 flask를 써도 상관없지만

상용과 같이 high load 환경에서 flask는 분산처리가 제대로 되지 않아 요청을 처리하는데 실패하거나, 처리가 지연돼서 read timeout이 발생하기 쉽다.

 

이러한 문제를 해결하기 위해 nginx와 WSGI 서버를 사용하는 것이 정석이다.

나의 경우 API 서버라서 nginx를 사용하지 않고 WSGI 서버만 사용하고싶었다.

 

다른 출처에서는 gunicorn으로 flask의 app.py를 한번 더 감싸는 방법을 소개하는데,

flask의 app.py를 gunicorn 모듈로 실행하는 방법도 있다.

명령어는 

gunicorn --workers=1 --threads=4 --bind 0:5000 --timeout=0 file_name:app

이고, 

nohup 명령어를 이용해서 백그라운드로 실행할 수도 있다.

 

+ Recent posts