как у вас все работает? city.php инклудится в index?
ini_set('session.gc_maxlifetime', 3600*24*30);
ini_set('session.cookie_lifetime', 3600*24*30);
session_start();
Сначала настраиваем сессию, потом вызываем.
session_destroy(); убираете, зачем она там вообще? Если вы делаете инклуд, то вы сначала стартуете сессию, потом ее грохаете. Какой смысл, если unset($_SESSION['locality']); должно все что надо сделать.
Если перед session_start() будет что - либо выводиться(хтмл или ошибка) сессия стартовать не будет. То же касается и session_destroy();
Обычно если есть какие-либо ошибки их можно отследить в ерорлоге или включить вывод ошибок через настройку php.ini и понять какие проблемы возникли при создании сессии. В частности есть вариант что переполнен диск и сессии просто не создаются на диске.
Если это все у вас отдельные страницы(то есть есть еще страницы кроме index.php) во всех в начале должно быть session_start();, иначе сессии работать не будут. Эта директива создает связь куки в браузере и сессионной записи на сервере, без нее механизм сессий работать не будет, т.е. сессию нужно каждый раз "перестартовать".